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 / gamma
table = np.array([((i / 255.0) ** invGamma) * 255
for 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)