开/闭运算(python+opencv)

接下来介绍图像形态学中的几个基本操作:腐蚀、膨胀、开操作、闭操作。

腐蚀

好吧,其实就是选择滑动窗口中像素值最小的点(局部最小值)
公式表示:

dst(x,y)=erode(src(x,y))=min(x,y)src(x+x,y+y) d s t ( x , y ) = e r o d e ( s r c ( x , y ) ) = m i n ( x ′ , y ′ ) s r c ( x + x ′ , y + y ′ )

可以理解为,移动结构B,如果结构B与结构A的交集完全属于结构A的区域内,则保存该位置点,所有满足条件的点构成结构A被结构B腐蚀的结果。
开/闭运算(python+opencv)_第1张图片
函数原型:

 dst=cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

膨胀

恩,当然就是局部最大值
公式表示:

dst(x,y)=dilate(src(x,y))=max(x,y)src(x+x,y+y) d s t ( x , y ) = d i l a t e ( s r c ( x , y ) ) = m a x ( x ′ , y ′ ) s r c ( x + x ′ , y + y ′ )

可以理解为,将结构B(核)在结构A上进行卷积操作,所有移动结构B与结构A存在交集的位置的集合为结构A在结构B作用下的膨胀结果。
开/闭运算(python+opencv)_第2张图片
函数原型:

 dst=cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

src:源图,通道数任意,数据类型可以为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F
dst:输出图,与src有着同样的尺寸
kernel:操作核(结构B),通常这个参数由函数getStructuringElement得到,你要乐意自己写一个也行
anchor:锚点位置,默认值为中心点
iterations:自身迭代的次数,默认为1

常规用于计算kernel的函数getStructuringElement,函数原型:

retval=cv2.getStructuringElement(shape, ksize[, anchor])

retval:得到的核,矩阵形式
shape:核的形状,有cv2.MORPH_RECT、cv2.MORPH_CROSS和cv2.MORPH_ELLIPSE
ksize:核的大小, (x,y) 形式
anchor:锚点,默认为中心

开操作

公式表示:

dst = open(src(x,y)) = dilate(erode(src(x,y)))

先腐蚀后膨胀的操作称之为开操作。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。
采用上图的结构B对原件进行开操作。
函数原型:

dst = cv2.morphologyEx(src,cv2.MORPH_OPEN,kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

开/闭运算(python+opencv)_第3张图片

闭操作

公式表示:

dst = open(src(x,y)) = erode(dilate(src(x,y)))

先膨胀后腐蚀的操作称之为闭操作。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
采用上图的结构对原件进行闭操作。
函数原型:

dst = cv2.morphologyEx(src,cv2.MORPH_CLOSE,kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

开/闭运算(python+opencv)_第4张图片

引申

形态学梯度

公式表示:

dst(x,y)=morph_grad(src(x,y))=dilate(src(x,y))erode(src(x,y)) d s t ( x , y ) = m o r p h _ g r a d ( s r c ( x , y ) ) = d i l a t e ( s r c ( x , y ) ) − e r o d e ( s r c ( x , y ) )

简单讲,就是膨胀以后的图像减去腐蚀以后的图像。
开/闭运算(python+opencv)_第5张图片
函数原型:

dst = cv2.morphologyEx(src,cv2.MORPH_GRADIENT,kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
#或者可以这样写
cv2.dilate() - cv2.erode()

顶帽

公式表示:

dst(x,y)=top_hat(src(x,y))=src(x,y)open(src(x,y)) d s t ( x , y ) = t o p _ h a t ( s r c ( x , y ) ) = s r c ( x , y ) − o p e n ( s r c ( x , y ) )

简单讲,就是原图减去开运算以后的图像。
开/闭运算(python+opencv)_第6张图片
函数原型:

dst = cv2.morphologyEx(src,cv2.MORPH_TOPHAT,kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

黑帽

公式表示:

dst(x,y)=black_hat(src(x,y))=close(src(x,y))src(x,y) d s t ( x , y ) = b l a c k _ h a t ( s r c ( x , y ) ) = c l o s e ( s r c ( x , y ) ) − s r c ( x , y )

简单讲,就是闭运算以后的图像减去原图。
开/闭运算(python+opencv)_第7张图片
函数原型:

dst = cv2.morphologyEx(src,cv2.MORPH_BLACKHAT,kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

你可能感兴趣的:(python,opencv)