温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python常用图像形态学操作实例分析

发布时间:2022-08-17 16:10:45 来源:亿速云 阅读:154 作者:iii 栏目:开发技术

今天小编给大家分享一下Python常用图像形态学操作实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

腐蚀

在一些图像中,会有一些异常的部分,比如这样的毛刺:

Python常用图像形态学操作实例分析

对于这样的情况,我们就可以应用复式操作了。需要注意的是,腐蚀操作只能处理二值图像,即像素矩阵的值只有0(黑色)和255(白色)。我们先看看代码和效果:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
# 腐蚀的代码
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

这张图片已经几乎看不到毛刺了,但与此同时,三个文字也小了一点,这就是腐蚀操作。所谓腐蚀操作,就是我们设置一个n×n的矩阵,这个矩阵可以视为一个卷积核,在原图上进移动。矩阵覆盖住的像素点中,如果有0(黑色),那么该卷积核的中心位置置零,反之,如果该卷积核内全都是255,则不做操作:

Python常用图像形态学操作实例分析

注意:我们可以理解成腐蚀操作是完全根据原图生成的新图,而不是在原土上的修改。

接下来我们再看看腐蚀的代码:

kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

首先,我们要利用numpy库生成一个n×n大小的全1矩阵kernel作为卷积核,并且需要指定数据类型为无符号8位整数。然后使用erode()函数,其接收的参数分别为图像矩阵,kernel矩阵,以及迭代次数。迭代次数就是腐蚀操作的次数。下面我们用一个圆来查看一下不同迭代次数的腐蚀效果:

import cv2
import numpy as np
kernel = np.ones((30,30),np.uint8)
pie = cv2.imread('pie.png')
# 观察不同的迭代次数
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

膨胀

腐蚀操作可以腐蚀掉二值图像的边缘,因此可以消除掉一些图片上的毛刺,但是损失一些原图相中有效的部分也是在所难免的。膨胀其实就是腐蚀操作的反面。“卷积核”包裹住的像素中有255,则这个卷积核中心位置会置为255,否则不变。因此,膨胀操作会把原本的图像范围进行扩大:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')

kernel = np.ones((3,3),np.uint8)
# 膨胀操作
dige_dilate = cv2.dilate(img,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

可以看到,膨胀操作后,图像的范围变大了一圈,就连毛刺也都扩大了。膨胀操作通常会配合腐蚀操作一起使用的,先腐蚀在膨胀,可以在保持图片中有效内容大小大体不变的情况下去除掉毛刺:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 腐蚀
erosion = cv2.erode(img,kernel,iterations = 1) # 对原图像进行腐蚀
# 膨胀
dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) # 对腐蚀后图像进行膨胀
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

开运算与闭运算

开运算与闭运算都是应用腐蚀与膨胀操作来处理原图像的。区别在于开运算是先腐蚀在膨胀,闭运算是先膨胀再腐蚀。这两个操作需要用到的函数都是morphologyEx(),只需要调整参数即可完成两种不同的操作。

开运算

执行开运算的函数是:

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

kernel依然是n×n的矩阵,cv2.MORPH_OPEN指定了执行运算为开运算:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果为:

Python常用图像形态学操作实例分析

闭运算

和开运算基本相同,只需要把morphologyEx()函数的第二个参数改为cv2.MORPH_CLOSE即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

很明显,先膨胀再腐蚀和原图并没有什么区别,仅仅是比原图大了一圈,因此闭运算也没有开运算应用广泛。

梯度运算

梯度运算本质是膨胀-腐蚀。从这个定义中不难发现,梯度就是原图的边缘部分。获取梯度依然要用到morphologyEx()函数,将第二个参数改为cv2.MORPH_GRADIENT即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 先用开运算把毛刺去掉:
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的结果就是下面这样:

Python常用图像形态学操作实例分析

礼帽与黑帽

礼帽和黑帽都是翻译的结果,因此我们不能望文生义。礼貌操作就是原始图像-开运算结果,黑帽操作是闭运算-原始输入。依然是用morphologyEx()函数,通过修改第二个参数完成。

礼帽

礼帽操作需要用到的参数是cv2.MORPH_TOPHAT。由礼帽操作的定义可以直到,礼帽操作可以得到图片中的“毛刺”部分:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 礼帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的结果为:

Python常用图像形态学操作实例分析

黑帽

黑帽操作需要用到的参数是cv2.MORPH_BLACKHAT,黑帽运算会输出执行闭运算后的图像比原图大出的一小圈轮廓:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((5,5),np.uint8) # kernel矩阵维度大一些会让黑帽操作的结果更明显
# 黑帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用图像形态学操作实例分析

以上就是“Python常用图像形态学操作实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI