前言
在OpenCV中,膨胀和腐蚀是基本的形态学操作,膨胀是使用像素邻域内的局部极大运算来膨胀一张图片,腐蚀是使用像素邻域内的局部极小运算来腐蚀一张图片,二者是一对相反的操作,但是都是对图像中的白色部分(高亮部分)而言的,膨胀用dilate()函数,腐蚀用erode()函数。
正文
腐蚀 erode
效果图
可以很明显的看到被腐蚀了。
函数
erode
erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor, int iterations,int borderType, constScalar& borderValue )
rc:源图像
dst:目标图像。
kernel:膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。
我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
getStructuringElement
cv.getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
膨胀 dilate
效果图
函数
dilate
dilate(const Mat &src, Mat &dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)
src:輸入圖,可以多通道,深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:輸出圖,和輸入圖尺寸、型態相同。
kernel:結構元素,如果kernel=Mat()則為預設的3×3矩形,越大膨脹效果越明顯。
anchor:原點位置,預設為結構元素的中央。
iterations:執行次數,預設為1次,執行越多次膨脹效果越明顯。
代码
import cv2 as cv
import numpy as np
def erode_image(image):
print(image.shape)
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold ret:%s"%ret)
cv.imshow("threshold image",binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dst = cv.erode(binary,kernel)
cv.imshow("erode_image",dst)
def dilate_image(image):
print(image.shape)
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold ret:%s"%ret)
cv.imshow("threshold image",binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(4,4))
dst = cv.dilate(binary,kernel)
cv.imshow("erode_image",dst)
src = cv.imread("../images/boss2.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# erode_image(src)
# dilate_image(src)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
dst = cv.erode(src,kernel)
cv.imshow("RGB image dilate",dst)
cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
cv.destroyAllWindows()