1.滤波算法
opencv中的滤波算法包括:均值滤波、方框滤波、高斯滤波、中值滤波:
blur = cv2.blur(img, (3, 3)) #均值滤波
box = cv2.boxFilter(img,-1,(3,3), normalize=True) #方框滤波
gaussian = cv2.GaussianBlur(img, (3,3), 1) #高斯滤波
median = cv2.medianBlur(img, 3) #中值滤波
可以看到这些滤波算法的滤波核的参数设置方式,除了中值滤波设置为3,其他的都设置为(3,3)传入函数即可。
注意:在opencv的形态学操作中,核不可以(3,3)的方式传入,如:
img_erode = cv2.erode(img, (3,3))
这种方式就是错误的,必须要如下设置:
kernel = np.ones((3,3), np.uint8)
img_erode = cv2.erode(img, kernel, iteration=1) #迭代次数为1
cv2.imshow('erode', img_erode)
cv2.waitKey(0)
cv2.destroyWindows()
因为在cv2.erode()函数中,核参数的数据结构就是一个Numpy数组,而不是类似(3,3)这样的元组结构。
如果是以c++代码实现opencv的腐蚀操作,则核参数需要设置为cv::Mat格式传入即可。
2.梯度计算
图像处理中的梯度计算:膨胀后的图像 - 腐蚀后的图像。
注意:
2.1 膨胀和腐蚀操作的核大小要一致;
2.2 计算梯度的核的尺寸没有固定值,取决于用户希望提取的轮廓的精细程度;
kernel = np.ones((3,3), uint8)
img = cv2.imread('dige.png')
img_dilate = cv2.dilate(img, kernel. iterations=1)
img_erode = cv2.erode(img, kernel, iterations=1)
#梯度计算方法有两种,一种是直接用 膨胀的图像 - 腐蚀的图像
img_ed = img_dilate - img_erode
cv2.imshow('img_ed', img_ed)
cv2.waitKey(0)
#另一种就是直接调用函数
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=5) #迭代次数默认为1
cv2.imshow('gradient', gradient)
cv2.waitKey(0)