OpenCV入门之OpenCV的基本操作5

电子说

1.2w人已加入

描述

9、形态学操作: 腐蚀、膨胀、开运算、闭运算、顶帽、黑帽

利用一种特殊的结构(卷积核)来测量或提取输入图像中对应的形状或特征以便进一步图像分析和识别,基本都是对二进制图像进行处理。

基本操作:膨胀和腐蚀,开运算、闭运算、顶帽、黑帽

腐蚀操作 ,用卷积核扫描图像,一般都为1,如果图像内卷积核范围内全是白的(255),那255保留,如果卷积核范围内有黑的(0),那么该范围都变为黑的(0)。

膨胀操作 ,与腐蚀操作相反,只要保证卷积核的锚点是非0值(255),周边无论是0还是非0,都变成非0值(255)。

开运算 :腐蚀+膨胀,去除外部噪声,去除白点。

闭运算 :膨胀+腐蚀,去除内部噪声,去除黑点。

顶帽操作 :原图-开运算,得到外部去掉的噪声。

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。

顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

黑帽操作 :原图-闭运算,得到内部去掉的噪声。

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。

所以,黑帽运算用来分离比邻近点暗一些的斑块。可以得到轮廓效果图。

形态学梯度 :图像膨胀与腐蚀的差别。结果看上去就像前景物体的轮廓。

基本梯度 :膨胀后图像减去腐蚀后图像得到的差值图像。

内部梯度 :用原图减去腐蚀图像得到的差值图像。

外部梯度 :膨胀后图像减去原图像得到的差值图像。

morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

src:输入图像

op:操作类型

MORTH_OPEN:函数做开运算

MORTH_CLOSE:函数做闭运算

MORTH_GRADIENT:函数做形态学梯度运算

MORTH_TOPHAT:函数做顶帽运算

MORTH_BLACKHAT:函数做黑帽运算

MORTH_DILATE :函数做膨胀运算

MORTH_ERODE:函数做腐蚀运算

kernel :内核类型,用getStructuringElement函数得到

def Morphology():
    # morphology 形态学
    # 利用一种特殊的结构(卷积核)来测量或提取输入图像中对应的形状或特征
    # 以便进一步图像分析和识别,基本都是对二进制图像进行处理
    # 基本操作:膨胀和腐蚀,开运算、闭运算、顶帽、黑帽
    # 图像全局二值化,将每个像素转换为两种值(0,255)
    img = cv2.imread('./images/bank.png')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


    # 返回两个值,阈值和处理后的图片,大于thresh(127)全是白的255
    # THRESH_BINARY 二进制阈值化 -> 大于阈值为1,小于阈值为0
    # THRESH_BINARY_INV 反二进制阈值化 -> 大于阈值为0,小于阈值为1
    # THRESH_TRUNC 截断阈值化 -> 大于阈值为阈值,小于阈值不变
    # THRESH_TOZERO 阈值化为0 -> 大于阈值的不变,小于阈值的全为0
    # THRESH_TOZERO_INV 反阈值化为0 -> 大于阈值为0,小于阈值不变
    # thresh,img_bw = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
    # 自适应阈值二值化 阈值是根据图像上的每一个小区域计算与其对应的阈值。
    # ADAPTIVE_THRESH_MEAN_C(通过平均的方法取得平均值)———阈值取自相邻区域的平均值)
    # ADAPTIVE_THRESH_GAUSSIAN_C(通过高斯取得高斯值)———阈值取自相邻区域的加权和
    # blockSize Int类型的,这个值来决定像素的邻域块有多大。
    # C:偏移值调整量,计算adaptiveMethod用到的参数。
    img_bw = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,0)


    # 获取形态学卷积核
    # cv2.MORPH_ELLIPSE 椭圆,cv2.MORPH_RECT 矩形,cv2.MORPH_CROSS 十字架
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
    # kernel = np.ones((3, 3), np.uint8)
    # 腐蚀操作,用卷积核扫描图像,一般都为1,如果图像内卷积核范围内全是白的,那扫后为白的
    # iterations 为迭代次数
    img_erode = cv2.erode(img_bw,kernel,iterations=2)


    # 膨胀操作,与腐蚀操作相反,只要保证卷积核的锚点是非0值(白的),周边无论是0还是非0,都变成非0值
    img_dilate = cv2.dilate(img_bw,kernel)


    # 开运算:腐蚀➕膨胀,去除外部噪声,去除白点
    # 闭运算:膨胀➕腐蚀,去除内部噪声,去除黑点
    open_operate = cv2.morphologyEx(img_bw,cv2.MORPH_OPEN,kernel,iterations=2)
    close_operate = cv2.morphologyEx(img_bw,cv2.MORPH_CLOSE,kernel,iterations=2)


    # 形态学的梯度,:原图-腐蚀,得到腐蚀掉的部分,即边
    img_grad = cv2.morphologyEx(img_bw,cv2.MORPH_GRADIENT,kernel)


    # 顶帽操作:原图-开运算,得到外部去掉的噪声
    img_tophat = cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,kernel)

    # 黑帽操作:原图-闭运算,得到内部去掉的噪声
    img_blackhat = cv2.morphologyEx(gray,cv2.MORPH_BLACKHAT,kernel)


    cv2.imshow("imshow",img_tophat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果

原图&二值化

腐蚀&膨胀

开运算&闭运算

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分