1.通道交換
讀取圖像,然后將RGB通道替換成BGR通道,需要注意的是,opencv讀取的圖像默認是BGR。cv2.cvtColor函數可以參考Color Space Conversions
img = cv2.imread('imori.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('answer.png', img)
2.灰度化(Grayscale)
灰度化的計算公式為:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
3. 二值化(Thresholding)
將大于閾值的像素值令為255,否則令為0。cv2.threshold函數可以參考Miscellaneous Image Transformations
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
4. 大津二值化算法(Otsu's Method)
大津算法是一種可以自動確定二值化中閾值的算法。https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html?該頁面的"Otsu's Binarization"章節
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
5. HSV變換
將使用HSV表示的圖像的色相反轉。需要注意的是色相(Hue)將顏色從0°到360°表示。HSV顏色模型可以參考https://baike.baidu.com/item/HSV/547122
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 進行色相反轉
img[:, :, 0] = (img[:, :, 0] + 180) % 360
img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)
6. 減色處理
將圖像的值由?2563?壓縮至?43?,即RGB的值只取{32,96,169,224}
img = img // 64 * 64 + 32
7. 平均池化(Average Pooling)
將圖像按照固定大小網格分割,網格內的像素值取網格內所有像素的平均值。關于池化的操作似乎在opencv中沒找到,只找到了在skimage中的實現?https://stackoverflow.com/questions/42463172/how-to-perform-max-mean-pooling-on-a-2d-array-using-numpy
img = skimage.measure.block_reduce(img, (8, 8, 1), np.mean)
8. 最大池化(Max Pooling)
與平均池化類似
img = skimage.measure.block_reduce(img, (8, 8, 1), np.max)
9. 高斯濾波(Gaussian Filter)
使用高斯濾波器(?3×3?大小,標準差?�=1.3?)進行降噪處理。高斯濾波器將中心像素按照高斯分布加權平均進行平滑化。cv2.GaussianBlur函數可以參考OpenCV: Image Filtering。標準差?�=1.3?的8-緊鄰高斯濾波器為:
img = cv2.GaussianBlur(img, (3, 3), 1.3)
10. 中值濾波(Median Filter)
使用中值濾波器(?3×3?大小)進行降噪處理。cv2.medianBlur函數可以參考OpenCV: Image Filtering
img = cv2.medianBlur(img, 3)
11. 均值濾波器
使用均值濾波器(?3×3?大小)進行降噪處理。cv2.blur函數可以參考OpenCV: Image Filtering
img = cv2.blur(img, (3, 3))
12. Motion Filter
motion濾波好像并沒有直接可以調用,因此先定義一個卷積核kernel,再利用cv2.filter2D進行卷積。cv2.filter2D可以參考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga27c049795ce870216ddfb366086b5a04
# 生成一個對角線方向的卷積核(kernel)
kernel = np.diag([1]*3) / 3
img = cv2.filter2D(img, -1, kernel)
motion濾波的效果可以參考https://docs.gimp.org/2.8/en/plug-in-mblur.html
13. MAX-MIN濾波器
MAX-MIN濾波器使用網格內像素的最大值和最小值的差值對網格內像素重新賦值。通常用于邊緣檢測。
erode和dilate都是形態學操作,分別相當于min濾波和max濾波,erode可以參考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaeb1e0c1033e3f6b891a25d0511362aeb?dilate可以參考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga4ff0f3318642c4f469d0e11f242f3b6c
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3))
img_max = cv2.dilate(img, kernel)
img_min = cv2.erode(img, kernel)
img = img_max - img_min
14. 差分濾波器(Differential Filter)
差分濾波器對圖像亮度急劇變化的邊緣有提取效果,可以獲得鄰接像素的差值。
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel_y = np.array([[0, -1, 0],[0, 1, 0],[0, 0, 0]])
img_y = cv2.filter2D(img, -1, kernel)
kernel_x = np.array([[0, 0, 0],[-1, 1, -0],[0, 0, 0]])
img_x = cv2.filter2D(img, -1, kernel)
15. Sobel濾波器
Sobel濾波器可以提取特定方向(縱向或橫向)的邊緣。sobel濾波器可以參考OpenCV: Image Filtering。濾波器按下式定義:
縱向:
橫向:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_x = cv2.Sobel(img, cv2.CV_64F, 1, 0)
img_y = cv2.Sobel(img, cv2.CV_64F, 0, 1)
16. Prewitt濾波器
Prewitt濾波器是用于邊緣檢測的一種濾波器,其函數可以參考https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.prewitt.html
縱向:
橫向:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_x = scipy.ndimage.prewitt(img, 1)
img_y = scipy.ndimage.prewitt(img, 0)
17. Laplacian濾波器
Laplacian濾波器是對圖像亮度進行二次微分從而檢測邊緣的濾波器。https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6
縱向:
橫向:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Laplacian(img,cv2.CV_64F)
18. Emboss濾波器
Emboss濾波器可以使物體輪廓更加清晰
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]])
img = cv2.filter2D(img, -1, kernel)
19. Log濾波器
LoG即高斯-拉普拉斯(Laplacian of Gaussian)的縮寫,使用高斯濾波器使圖像平滑化之后再使用拉普拉斯濾波器使圖像的輪廓更加清晰。其函數可以參考https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_laplace.html
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = scipy.ndimage.gaussian_laplace(img, sigma=3)
20. 直方圖繪制
繪制直方圖顯示不同數值的像素出現的次數。在 Matplotlib 中有 hist() 函數提供繪制直方圖的接口。https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html
img = cv2.imread('imori_dark.jpg').astype(np.float)
plt.hist(img.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("answer.png")
21. 直方圖均衡化
直方圖均衡化是一種增強圖像對比度的方法,其主要思想是將一副圖像的直方圖分布變成近似均勻分布。其參考https://stackoverflow.com/questions/31998428/opencv-python-equalizehist-colored-image
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# equalize the histogram of the Y channel
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
# convert the YUV image back to RGB format
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
22. 伽馬校正
伽馬校正用來對照相機等電子設備傳感器的非線性轉換特性進行校正。如果圖像鴛鴦顯示在顯示器上,畫面就會顯得很暗。伽馬校正通過預先增大RGB值來排除顯示器的影響,達到對圖像修正的目的。其參考https://stackoverflow.com/questions/33322488/how-to-change-image-illumination-in-opencv-python/41061351
def adjust_gamma(image, gamma=1.0):invGamma = 1.0 / gammatable = np.array([((i / 255.0) ** invGamma) * 255for i in np.arange(0, 256)]).astype("uint8")return cv2.LUT(image, table)original = cv2.imread('imori_gamma.jpg')
gamma = 2.2
adjusted = adjust_gamma(original, gamma=gamma)
cv2.imwrite('answer.png', adjusted)
23. 常見的插值方法
包括雙三次、雙線性、最鄰近插值。
img = cv2.imread('imori.jpg')
height, width = img.shape[:2]
new_height, new_width = int(height/2), int(width/2)
# 雙三次
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_CUBIC)
# 雙線性
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
# 最鄰近
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST)