图像腐蚀与图像膨胀(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



posted @ 2019-07-15 10:32  柳帅  阅读(35289)  评论(0编辑  收藏  举报
//替换成自己路径的js文件