Open CV系列学习笔记(二十)膨胀与腐蚀 2021-02-14

本文介绍了OpenCV中的图像膨胀和腐蚀操作,这两种技术在二值图像处理中至关重要,通过结构元素控制对象的大小变化和边缘平滑。膨胀使对象变粗,腐蚀则细化对象。实例展示了使用3x3和自定义结构元素进行操作的过程。

Open CV系列学习笔记(二十)膨胀与腐蚀

图像形态学

图像形态学是图像处理学科的一个单独分支学科
灰度与二值图像处理中重要手段
是由数学的集合论等相关理论发展起来的
在这里插入图片描述

图像膨胀

膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。图中说明了膨胀的计算过程。图(a)显示了包含一个矩形对象的简单二值图像;图(b)是一个结构元素,在此例中它是一条5个像素长的斜线。计算时,结构元素通常用0和1的矩阵表示。有时,如图中所示,为方便起见可只显示1。另外,结构元素的原点必须明确标明。图(b)用黑色方框标明了结构元素的原点。图©明确地描述了膨胀处理,这种处理会将结构元素的原点平移过整个图像区域,并且核对哪些地方与值为I的像素重叠。图(d)所示的输出图像在原点的每个位置均为1,从而在输人图像中结构元素至少重叠了一个1值像素。
3x3的结构元素/模板
注意:
-腐蚀与膨胀都支持
-任意形状的结构元素
在这里插入图片描述

膨胀满足交换律:即A⊕B=B⊕A .在图像处理中,习惯于令A⊕B的第一个操作数为图像,而第二个操作数微结构元素,结构图像往往比元素小很多。
膨胀的作用
 对象大小增加一个像素(3x3)
 平滑对象边缘
 减少或者填充对象之间的距离.
代码:

def dilate_demo(image):#图像膨胀                                       
    print(image.shape)                                             
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)                   
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.
    cv.imshow("binary",binary)                                     
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,10))        
    dst = cv.dilate(binary,kernel)                                 
    cv.imshow("erode_demo",dst)                                    

结果:
在这里插入图片描述
在这里插入图片描述

图像腐蚀

腐蚀“收缩"或“细化”二值图像中的对象。像在膨胀中一样, 收缩的方式和程度由一个结构元素控制。下图说明了腐蚀过程。图膨胀(a)和图腐蚀(a)相同,图腐蚀(b)是结构元素,即一条短垂直线。图腐蚀©生动地描述了腐蚀在整个图像区域平移结构元素的过程,并检查在哪里完全匹配图像的前景部分。图腐蚀(d)所示的输出图像中,结构元素原点的每个位置的值为1,因而该元素仅叠加了输人图像的1值像素(即它并不叠加任何图像背景)。

腐蚀的数学定义与膨胀相似,A被B腐蚀记为AB,定义为
在这里插入图片描述

换言之,A被B腐蚀是所有结构元素的原点位置的集合,其中平移的B与A的背景并不叠加。
在这里插入图片描述
腐蚀的作用
 对象大小减少1个像素(3x3)
 平滑对象边缘
 弱化或者分割图像之间的半岛型连接
代码:

def erode_demo(image):#图像腐蚀                                                       
    print(image.shape)                                                            
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)                                  
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)   
    cv.imshow("binary",binary)                                                    
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,10))                       
    dst = cv.erode(binary,kernel)                                                 
    cv.imshow("erode_demo",dst)                                                   

结果:
在这里插入图片描述
在这里插入图片描述
完整代码:

import cv2 as cv
import numpy as np


def erode_demo(image):#图像腐蚀
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,10))
    dst = cv.erode(binary,kernel)
    cv.imshow("erode_demo",dst)


def dilate_demo(image):#图像膨胀
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,10))
    dst = cv.dilate(binary,kernel)
    cv.imshow("erode_demo",dst)


print("--------HEllow Python-------")
src = cv.imread("E:/picture/01.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
erode_demo(src)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(4,4))
dst = cv.erode(src,kernel)
cv.imshow("output",dst)

cv.waitKey(0)


cv.destroyAllWindows()
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值