以下例子由此图演示:
import cv2 as cv
img=cv.imread('lena.jpg',1)
cv.imshow('lena',img)
cv.waitKey(0)
cv.destroyAllWindows()
形态学操作:
腐蚀操作:
cv2.erode(图像对象,内核(卷积核),interations)
内核:核越大,腐蚀程度越高可自行定义,例如:kernel=np.ones((3,3),np.uint8)
interations:迭代次数,默认为1.
膨胀操作:
cv2.dilate(图像对象,内核,interations)
腐蚀操作和膨胀操作顾名思义,使图像腐蚀和膨胀.
开运算操作:
open=cv2.morphologyEx(图像对象,cv2.MORPH_OPEN,内核)
开运算操作=腐蚀操作+膨胀操作
闭运算操作:
close=cv2.morphologyEx(图像对象,cv2.MORPH_CLOSE,内核)
闭运算操作=膨胀操作+腐蚀操作
梯度运算操作:
gradient=cv2.morphologyEx(图像对象,cv2.MORPH_CARDIENT,内核)
梯度运算操作=膨胀操作-腐蚀操作
礼帽运算操作:
tophat=cv2.morphologyEx(图像对象,cv2.MORPH_TOPHAT,内核)
礼帽运算操作=原始输入-开运算
用于分离亮区域
黑帽运算操作:
blackhat=cv2.morphologyEx(图像对象,cv2.MORPH_BLACKHAT,内核)
黑帽运算操作=闭运算-原始输入
用于分离暗区域.
自定义卷积内核:
使用cv2: cv2.getStructuringElement(内核形状,内核尺寸,锚点位置)
内核形状:
矩形:cv2.MORPH_RECT
椭圆形:cv2.MORPH_ELLIOSE
交叉形:cv2.MORPH_EROSS
锚点位置:默认为(-1,-1)即中心点.
使用numpy: np.ones(形状数组,数据类型)
数据类型:常用的有np.int8和np.float64
np.zeros(形状数组,数据类型)
图像平滑处理(模糊处理):
线性滤波:cv2.filter2D(图像对象,ddepth,卷积核)
ddepth:图像的深度,'-1'表示和原图像保持一样的深度.
(进行简单的平均卷积操作)均值滤波:cv2.blur(图像对象,卷积核)
方框滤波:cv2.boxFilter(图像对象,-1,卷积核,normalize)
-1:表示和图像颜色通道保持一致,一般情况下固定用-1.
normalize:选择是否归一化,True则和均值滤波效果一致,False则可能会数值越界(即>255),若是越界则一律为'255'.
高斯滤波:cv2.GaussianBlur(图像对象,卷积核,权重)
img=cv.GaussianBlur(img,[5,5],1)
中值滤波:cv2.medinaBlur(图像对象,卷积核)
img=cv.blur(img,[5,5])
小结:
自定义内核一般用numpy定义全为1的矩阵比较多.且内核尺寸一般为单数(即3、5、7)
图像模糊处理关于核的参数只要输入大小即可,不需要单独定义,而形态学处理则需定义内核后填入.
形态学操作除基础的腐蚀、膨胀操作外,其余所使用的内核可以稍大些。