第三章 OpenCV篇-图像形态学的综合操作-Python

目录

一.腐蚀操作

二.膨胀操作

三.开运算与闭运算

四.梯度运算

五.礼帽与黑帽


此章节主要讲解有如下:腐蚀操作、膨胀操作、开运算与闭运算、梯度计算、礼帽与黑帽

一.腐蚀操作

腐蚀操作是先去除噪声,再还原图像,将图像变得越来越小、线条越来越细,使图像更加精细。

腐蚀操作需要numpy库中的ones函数。

其格式如下:

kerne = numpy.ones((数字(矩阵的行数),数字(矩阵的列数)),矩阵的数据类型)

注:矩阵创建的时候最好是一个方阵。

腐蚀操作的语法如下:

cv2.erode(图像,kerne,iterations=1)

参数1:待处理的图像,参数2:核,参数3:迭代次数

核差不多相当于一个矩阵,

代码效果演示如下:

腐蚀操作前原图像如下

import cv2
import numpy as np
# np.ones的作用是创建一个5*5的矩阵,元素全为1
# np.uint8的作用是创建一个无符号整型8位的矩阵
# np.ones的第一个参数是创建的矩阵的行数和列数,第二个参数是创建的矩阵的数据类型
# 矩阵的类型有3种,uint8、int8、float32
ker = np.ones((5,5),np.uint8)
image = cv2.imread('8.jpg')
# 腐蚀操作
# 参数1:待处理的图像,参数2:核,参数3:迭代次数
# 迭代次数的作用是,erosion操作会连续进行多次,每次erosion操作都会对图像进行腐蚀
ero = cv2.erode(image,ker,iterations = 1)
cv2.imshow('ero',ero)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:复制我代码需要在PyCharm有对应图像和图像名字。

腐蚀操作后图像如下:

注:

核的大小,尽力与图像矩阵的大小相差不大,若核太小,则腐蚀效果不会达到用户期望的样子。

腐蚀迭代案例如下:

原图像如下

import cv2
import numpy as np
image = cv2.imread('10.png')
ker = np.ones((30,30),np.uint8)
erosion1 = cv2.erode(image,ker,iterations = 1)
erosion2 = cv2.erode(image,ker,iterations = 2)
erosion3 = cv2.erode(image,ker,iterations = 3)
res = np.hstack((erosion1,erosion2,erosion3))
cv2.imshow('erosion',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:复制我代码需要在PyCharm有对应图像和图像名字。

腐蚀迭代次数后图像如下:

二.膨胀操作

膨胀操作是腐蚀操作的逆过程,即先腐蚀,再膨胀,可以理解为先去除噪声,再还原图像。使图像的线条变得更加粗大。

膨胀操作需要numpy库中的ones函数。

其格式如下:

kerne = numpy.ones((数字(矩阵的行数),数字(矩阵的列数)),矩阵的数据类型)

注:矩阵创建的时候最好是一个方阵。

膨胀操作语法如下:

_dilate = cv2.dilate(图像,kerne,iterations = 次数)

代码如下:

原图像

# 膨胀操作是腐蚀操作的逆过程,即先腐蚀,再膨胀,可以理解为先去除噪声,再还原图像
import cv2
import numpy as np
image = cv2.imread('8.jpg')
ker = np.ones((5,5),np.uint8)
erode = cv2.erode(image,ker,iterations = 1)
cv2.imshow('erode',erode)
dilate = cv2.dilate(erode,ker,iterations = 1)
cv2.imshow('dilate',dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:复制我代码需要在PyCharm有对应图像和图像名字。

腐蚀操作后的图像和膨胀操作后的线条对比

膨胀迭代次数图像呈现如下:

原图像如下

注:复制我代码需要在PyCharm有对应图像和图像名字。

膨胀多次迭代后的图像如下

三.开运算与闭运算

开运算:先腐蚀再膨胀。

闭运算:先膨胀再腐蚀

通过前面腐蚀和膨胀操作都知道需要numpy函数创建一个矩阵

ker = np.ones((5,5),np.uint8)

注:np是我在原代码用np代替了numpy全名

开运算与闭运算操作格式如下:

cv2.morphologyEx(原图, 操作类型,ker)

morphologyEx函数,第一个参数是原图,第二个参数是操作类型,第三个参数是核

操作类型有:MORPH_OPEN、MORPH_CLOSE、MORPH_GRADIENT、MORPH_TOPHAT、MORPH_BLACKHAT
它们的区别是:
MORPH_OPEN:先腐蚀,再膨胀
MORPH_CLOSE:先膨胀,再腐蚀
MORPH_GRADIENT:膨胀与腐蚀的差值
MORPH_TOPHAT:原图与开运算的差值
MORPH_BLACKHAT:闭运算与原图的差值

开运算:cv2.morphologyEx(原图, cv2.MORPH_OPEN,ker)

闭运算: cv2.morphologyEx(原图,cv2.MORPH_CLOSE,ker)

原图如下:

代码如下:

import cv2
import numpy as np
image = cv2.imread('8.jpg')
ker = np.ones((5,5),np.uint8)
erode = cv2.erode(image,ker,iterations = 1)
dilate = cv2.dilate(erode,ker,iterations = 1)
# morphologyEx函数,第一个参数是原图,第二个参数是操作类型,第三个参数是核
# 操作类型有:MORPH_OPEN、MORPH_CLOSE、MORPH_GRADIENT、MORPH_TOPHAT、MORPH_BLACKHAT
# 它们的区别是:
# MORPH_OPEN:先腐蚀,再膨胀
# MORPH_CLOSE:先膨胀,再腐蚀

open = cv2.morphologyEx(image,cv2.MORPH_OPEN,ker)
close = cv2.morphologyEx(image,cv2.MORPH_CLOSE,ker)
cv2.imshow('open',open)
cv2.imshow('close',close)
cv2.waitKey(0)

注:复制我程序,需要在PyCharm有相应的图片和相应的第三方库。

开运算与闭运算后的图像如下:

四.梯度运算

梯度运算主要是我们想得到一个图像的轮廓,那么可以使用梯度运算来实现我们的目标。

梯度运算的相当于:梯度 = 膨胀-腐蚀

ker = numpy.ones((数字(矩阵的行数),数字(矩阵的列数)),矩阵的数据类型)

注:矩阵创建的时候最好是一个方阵。

梯度运算格式如下:

cv2.morphologyEx(原图, cv2.MORPH_GRADIENT,ker)

原图如下

import cv2
import numpy as np
image = cv2.imread('10.png')
ker = np.ones((5,5),np.uint8)
erode = cv2.erode(image,ker,iterations = 5)
dilate = cv2.dilate(erode,ker,iterations = 5)
# MORPH_GRADIENT:膨胀与腐蚀的差值
grad = cv2.morphologyEx(image,cv2.MORPH_GRADIENT,ker)
cv2.imshow('gradient',grad)
cv2.waitKey(0)

注:复制我代码的时候需要有相应的图片和名字以及第三方库

梯度运算后得到图像轮廓如下:

五.礼帽与黑帽

前面我们讲过morphologyEx的第二个参数代表着操作类型前面3个已经对应讲完,接下来是最后2个模式他们对应着礼帽与黑帽

若用户想要得到一个图像多余的部分可以通过礼帽得到。

若用户想要得到一个图像的浅浅的轮廓不需要多余的部分则可以通过黑帽得到。

MORPH_TOPHAT:原图与开运算的差值
MORPH_BLACKHAT:闭运算与原图的差值

ker = numpy.ones((数字(矩阵的行数),数字(矩阵的列数)),矩阵的数据类型)

注:矩阵创建的时候最好是一个方阵。

礼帽与黑帽语法格式如下:

礼帽:cv2.morphologyEx(原图, cv2. MORPH_TOPHAT T,ker)

黑帽:cv2.morphologyEx(原图, cv2. MORPH_BLACKHAT T,ker)

礼帽公式:礼帽 = 原始输入-开运算结果

黑帽公式:黑帽 = 闭运算-原始输入

原图如下:

代码如下:

import cv2
import numpy as np
image = cv2.imread('8.jpg')
ker = np.ones((5,5),np.uint8)
# MORPH_TOPHAT:原图与开运算的差值
# MORPH_BLACKHAT:闭运算与原图的差值
tophat = cv2.morphologyEx(image,cv2.MORPH_TOPHAT,ker)
blackhat = cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,ker)
cv2.imshow("tophat",tophat)
cv2.imshow("blackhat",blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:复制我代码的时候需要有相应的图片和名字以及第三方库

礼帽与黑帽后图像:

总结:

腐蚀操作:cv2.dilate(图像,kerne,iterations = 次数)

膨胀操作:_dilate = cv2.dilate(图像,kerne,iterations = 次数)

cv2.morphologyEx(原图, 操作类型,ker)

操作类型一共有五种分别是:MORPH_OPEN、MORPH_CLOSE、MORPH_GRADIENT、MORPH_TOPHAT、MORPH_BLACKHAT
它们的区别是:
MORPH_OPEN:先腐蚀,再膨胀
MORPH_CLOSE:先膨胀,再腐蚀
MORPH_GRADIENT:膨胀与腐蚀的差值
MORPH_TOPHAT:原图与开运算的差值
MORPH_BLACKHAT:闭运算与原图的差值

MORPH_OPEN是开运算、MORPH_CLOSE是闭运算、MORPH_GRADIENT是梯度运算、MORPH_TOPHAT是礼帽、MORPH_BLACKHAT是黑帽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值