opencv学习十九:膨胀与腐蚀

膨胀

在这里插入图片描述**加粗样式**在这里插入图片描述在这里插入图片描述

一:膨胀实现dilate

使用方法:dilate
结果=cv2.dilate(二值图像src,卷积核k,迭代次数itreations)
卷积核 正方形数组:如np.ones((5,5),np.uint8)

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()  #销毁所有窗口

解释说明:
在使用opencv的过程中,我们经常需要各种各样的卷积核。如果是正方形的核还好说,可以使用numpy,但是有时候需要定义椭圆形或者十字形的核,我们就需要用到结构化元素

cv2.getStructuringElement()
第一个参数表示核的形状。可以选择三种
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二个参数表示核的尺寸。

注意对象要为白色,本文图对象为黑色,所有我在代码里用反二值化
在这里插入图片描述

二:实现腐蚀erode

腐蚀主要针对的是二值图像,如只有0和1两个值,
两个输入对象:1原始二值图像,2卷积核
使用卷积核遍历原始二值图像,如果卷积核对应的元素值均为1,其值才为1,否则为0。
即用卷积核对应的最小元素替换掉当前中心像素。

腐蚀作用:对象大小减少一个像素,平滑对象边缘,弱化或者分割图像之间的半岛性连接。

使用方法:erode 中文翻译:侵蚀
处理结果=cv2.erode(原始图像src,卷积核kernel,迭代次数iterations)
卷积核kernel:一般为正方形数组
如:k=np.ones((5,5),np.uint8)
迭代次数iterations:腐蚀次数,默认1

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方法

自定义一个结构元素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函数会返回指定形状和尺寸的结构元素。

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112798499