opencv 形态学操作


形态学转换是基于图像形状的⼀些简单操作。它通常在⼆进制图像上执⾏。腐蚀和膨胀是两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽⿊帽等。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。

结构元素

我们可以手动创建了一个结构元素,OpenCV具有一个函数cv.getStructuringElement()。只需传递内核的形状和大小,即可获得所需的内核。

    # 矩形内核
    kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    # 十字内核
    kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))
    # 椭圆内核
    kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))

1、腐蚀

原始图像中的一个像素(无论是1还是0)只有当内核下的所有像素都是1时才被认为是1,否则它就会被侵蚀(变成0)

cv.erode(img,kernel,iterations)

参数:img: 要处理的图像        kernel: 核结构        iterations: 腐蚀的次数,默认是1

2、 膨胀

它与侵蚀正好相反。如果内核下的至少一个像素为“ 1”,则像素元素为“ 1”。

cv.dilate(img,kernel,iterations)

参数:img: 要处理的图像        kernel: 核结构        iterations: 腐蚀的次数,默认是1

def test():
    # 矩形内核
    kernel = np.ones((5, 5), np.uint8)
    kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    # 十字内核
    kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))
    # 椭圆内核
    kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))

    img = cv.imread('img_2.png')
    # 腐蚀
    img1 = cv.erode(img, kernel3, iterations=5)
    # 膨胀
    img2 = cv.dilate(img, kernel3, iterations=5)

    titles = ["原图","腐蚀","膨胀"]
    mpl.rcParams['font.family'] = 'SimHei'
    for i,img in enumerate([img,img1, img2]):
        plt.subplot(1, 3, i + 1), plt.imshow(img, 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()

3、开运算

侵蚀然后膨胀,它对于消除噪音很有用。

cv.morphologyEx(img, cv.MORPH_OPEN, kernel) 

4、闭运算

闭运算与开运算相反,膨胀然后侵蚀。在关闭前景对象内部的小孔或对象上的小黑点时很有用。

cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) 

5、形态学梯度

cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel) 

6、顶帽

输入图像和图像开运算之差。

cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel) 

7、 黑帽

输入图像和图像闭运算之差。

cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel) 
def test():
    img = cv.imread('cat.jpg',0)
    kernel = np.ones((5, 5), np.uint8)
    # 开运算
    opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
    # 闭运算
    closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
    # 形态学梯度
    gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
    # 顶帽
    tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
    # 黑帽
    blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

    titles = ["开运算","闭运算","形态学梯度","顶帽","黑帽"]
    mpl.rcParams['font.family'] = 'SimHei'
    for i,img in enumerate([opening,closing, gradient,tophat, blackhat]):
        plt.subplot(2, 3, i + 1), plt.imshow(img, 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值