OpenCV---膨胀与腐蚀
膨胀
腐蚀
一:膨胀实现dilate
import cv2 as cv import numpy as np def dilate_demo(image): #膨胀 print(image.shape) gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU) cv.imshow("binary",binary) kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5)) dst = cv.dilate(binary,kernel) cv.imshow("dilate_demo",dst) src = cv.imread("./5.png") #读取图片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 cv.imshow("input image",src) #通过名字将图像和窗口联系 dilate_demo(src) cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 cv.destroyAllWindows() #销毁所有窗口
二:实现腐蚀erode
def erode_demo(image): #腐蚀 print(image.shape) gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU) cv.imshow("binary",binary) kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3)) #可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强 dst = cv.erode(binary,kernel) cv.imshow("erode_demo",dst) src = cv.imread("./5.png") #读取图片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 cv.imshow("input image",src) #通过名字将图像和窗口联系 erode_demo(src) cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 cv.destroyAllWindows() #销毁所有窗口
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
相关知识补充
(一)可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大
(二)可以不进行灰度处理,对彩色图片进行处理
(1)膨胀
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) dst = cv.dilate(src,kernel) cv.imshow("result",dst)
(2)腐蚀
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) dst = cv.erode(src,kernel) cv.imshow("result",dst)
(三)getStructuringElement方法
推文:OpenCV中获取不同形状的结构元素getStructuringElement
自定义一个结构元素kernel,要声明一个Mat,然后对Mat的元素赋值;这种方法灵活但略显复杂
OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
getStructuringElement的内部并没有什么优化实现,只是封装了一下功能。其原理同样是声明一个Mat,然后求形状,指定Mat的值。
十字形为单线宽。
总之:getStructuringElement是一种更加简便的方法实现一个kernel
MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS
参数:
cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
def getStructuringElement(shape, ksize, anchor=None): # real signature unknown; restored from __doc__
第一个参数shape:表示内核的形状,有三种形状可以选择
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;
第二个参数ksize:是内核的尺寸(n,n)
第三个参数anchor:锚点的位置
返回值:
getStructuringElement函数会返回指定形状和尺寸的结构元素。