• 图像腐蚀与图像膨胀(18)


    一 基础知识

       图像的膨胀(dilation)和腐蚀(erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.

      其中膨胀类似与 '领域扩张' ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大.

      腐蚀类似 '领域被蚕食' ,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.

    二 图像膨胀

    膨胀的运算符是“⊕”,其定义如下:

      该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。

      图像中的高亮区(黑点增多)

    三 图像腐蚀

      腐蚀的运算符是“-”,其定义如下:

    该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。

    处理结果如下图所示:

       高亮区减少(白色区域减少)

    四. 图像腐蚀代码实现

    1.基础理论

    形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:

    (1)二值图像

    (2)卷积核

      卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

      被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。

    2.函数原型

    图像腐蚀主要使用的函数为erode,其原型如下:

    dst = cv2.erode(src, kernel, iterations)

      参数

    • dst表示处理的结果,
    • src表示原图像,kernel表示卷积核,
    • iterations表示迭代次数。

    下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    注意:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。

    3.代码实现

    完整代码如下所示:

    输出结果如下图所示:

      由图可见,干扰的细线被进行了清洗,但仍然有些轮廓,此时可设置迭代次数进行腐蚀。

    erosion = cv2.erode(src, kernel,iterations=9)

    输出结果如下图所示:

    三. 图像膨胀代码实现

    1.基础理论

      图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。

      (1) 图像被腐蚀后,去除了噪声,但是会压缩图像。

      (2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。

    它也包括两个输入对象:

      (1)二值图像或原始图像

      (2)卷积核

    卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

    被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0。

    2.函数原型

      图像膨胀主要使用的函数为dilate,其原型如下:

    dst = cv2.dilate(src, kernel, iterations)

    参数

    dst表示处理的结果,

    src表示原图像,

    kernel表示卷积核,

    iterations表示迭代次数。

    下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    注意:迭代次数默认是1,表示进行一次膨胀,也可以根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。

    3.代码实现

    完整代码如下所示:

    输出结果如下所示:

    图像去噪通常需要先腐蚀后膨胀,这又称为开运算.

    erosion = cv2.erode(src, kernel)
    
    result = cv2.dilate(erosion, kernel)

    四 黑帽、顶帽

    代码层面

    import cv2 as cv
    import numpy as np
    
    def top_hat_demo(image):
        '顶帽'
        gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        #构建形态学元素 提高内核矩阵(10,10)可以提取更多元素
        kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10))
        #黑帽处理
        dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)
    
        #如果图像较黑可以用图像增强看看效果
        cimage=np.array(gray.shape,np.uint8)
        cimage=50
        dst=cv.add(dst,cimage)
    
        cv.imshow('top_hat',dst)
    
    def black_hat_demo(image):
        '黑帽'
        gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        #构建形态学元素 提高内核矩阵(10,10)可以提取更多元素
        kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10))
        #黑帽处理
        dst=cv.morphologyEx(gray,cv.MORPH_BLACKHAT,kernel)
    
        #如果图像较黑可以用图像增强看看效果
        cimage=np.array(gray.shape,np.uint8)
        cimage=50
        dst=cv.add(dst,cimage)
    
        cv.imshow('black_hat',dst)
    
    src = cv.imread("girl.jpg")
    cv.imshow("原来", src)
    # black_hat_demo(src)
    top_hat_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

    效果展示

    五 图像顶帽运算

    1.基本原理  

      图像顶帽(或图像礼帽)运算是原始图像减去图像开运算的结果,得到图像的噪声。如下图所示:

    顶帽运算(img) = 原始图像(img) - 开运算(img) 

    2.函数原型
    图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数

    dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

    参数

    dst表示处理的结果,

    src表示原图像,

    cv2.MORPH_TOPHAT表示顶帽运算,

    kernel表示卷积核。

    下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    卷积如下图所示:

    3.代码实现

    完整代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像顶帽运算
    result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示,可以看到外部噪声被提取出来。


      如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:

    kernel = np.ones((10,10), np.uint8)
    result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

    二. 图像黑帽运算

    1.基本原理

      图像黑帽运算是图像闭运算操作减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点。如下图所示:

    黑帽运算(img) = 闭运算图像(img) - 原始图像(img) 

    2.函数原型

      图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_BLACKHAT对应开运算。其原型如下:

    dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

    参数

    • dst表示处理的结果,
    • src表示原图像,
    • cv2.MORPH_BLACKHAT表示黑帽运算,
    • kernel表示卷积核。

    下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    3.代码实现

    完整代码如下所示:

    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像黑帽运算
    result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示,可以看到图像内部黑点被提取出来。


      但内部比较大的四个黑点没有被提取,如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:

    kernel = np.ones((10,10), np.uint8)
    result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

    转载:

    https://blog.csdn.net/Eastmount/article/details/83692456



  • 相关阅读:
    工作流数据结构
    CssFrindly使用
    .NET平台BPM
    关于SQL SERVER高并发访问的解决办法
    Asp.net防止后退(清除页面缓存)
    Attaching the Script debugger to process ‘[****]’ on machine **** failed.
    FlowWork学习(数据库部分)
    SQL Server 存储过程
    AjaxControlToolkit的安装与使用详解
    Cantor定理的一种好表述
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10704970.html
Copyright © 2020-2023  润新知