三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)

形态学处理:

  1. 腐蚀

  2. 膨胀

  3. 开运算

  4. 闭运算

  5. 梯度运算

  6. 顶帽和黑帽操作


cv2.morphologyEx:三个对应的参数

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
  • MORPH_DILATE – 膨胀
  • MORPH_ERODE – 腐蚀
  • MORPH_OPEN – 开运算(Opening operation)
  • MORPH_CLOSE – 闭运算(Closing operation)
  • MORPH_GRADIENT -形态学梯度(Morphological gradient)
  • MORPH_TOPHAT - “顶帽”(“Top hat”)
  • MORPH_BLACKHAT - “黑帽”(“Black hat“)
  • 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。
  • 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
  • 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
  • 第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

1、腐蚀

目的:消除噪声、分割出独立的图像元素、在图像中连接相邻的元素、寻找出图像中的明显的极大值区域或者极小值区域、寻找图像的梯度

同样膨胀也是这个目的!下面是腐蚀的原理!

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第1张图片

腐蚀就是求图像区域最小值的操作。将图像(图像的一部分区域)与核进行卷积 核可以是任意形状和大小,可以自己定义,或者称为锚点 核与图像进行卷积,就是计算核覆盖的区域的像素点的最大值(最小值),分别对应膨胀和腐蚀 腐蚀和膨胀是一对好朋友,是相反的一对操作, 腐蚀就是求局部最小值的操作 ,而膨胀是求局部最大值的操作。

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('../image/caicai.jpg')
# cv2.imshow('img',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

"""
    1、腐蚀和膨胀
    将图像(图像的一部分区域)与核进行卷积
    核可以是任意形状和大小,可以自己定义,或者称为锚点
    核与图像进行卷积,就是计算核覆盖的区域的像素点的最大值(最小值),分别对应膨胀和腐蚀
    腐蚀和膨胀是一对好朋友,是相反的一对操作
    腐蚀就是求局部最小值的操作
    而膨胀是求局部最大值的操作
"""
kernel = np.ones((5,5),np.uint8)
print(kernel,kernel.shape)
erosion = cv2.erode(img,kernel,iterations=1)
# cv2.imshow('erosion',erosion)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

pie = cv2.imread('../image/caicai.jpg')
cv2.imshow('pie',pie)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

kernel2 = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel2,iterations=1)
erosion_2 = cv2.erode(pie,kernel2,iterations=2)
erosion_3 = cv2.erode(pie,kernel2,iterations=3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:后面的图像都是基于这张图片!!!

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第2张图片

显示出1,2,3次迭代后的图像

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第3张图片

 2、膨胀

就是求图像区域的最大值操作,将图像的区域与卷积核进行卷积操作,这个核的大小我们自己可以自己设置,计算核覆盖的区域的像素点的最大值,然后把最大值赋给参考点指定的像素,会使得图像的高亮区域变得更明显!也就是本来很优秀,变得更优秀了呢?你说气不气人!!!这就是膨胀!下面是原理图!

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第4张图片

 

import cv2
import numpy as np

"""
    膨胀操作
    核与图像区域进行卷积,然后求局部最大值
    
    效果就是线条变得更加粗糙
"""
img = cv2.imread('../image/caicai.jpg')
# cv2.imshow('img',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations=1)
res = np.hstack((img,dilate))
# cv2.imshow('res',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

#线条变得更粗糙了
kernel2 = np.ones((4,4),np.uint8)
dilate_1 = cv2.dilate(img,kernel2,iterations=1)
dilate_2 = cv2.dilate(img,kernel2,iterations=2)
dilate_3 = cv2.dilate(img,kernel2,iterations=3)

res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第5张图片

上面分别分别代表膨胀迭代次数为1,2,3的结果

3、开运算

就是先执行腐蚀操作后,再进行膨胀!

import cv2
import numpy as np

"""
    开运算:
    先腐蚀后膨胀
"""
img = cv2.imread('../image/caicai.jpg')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第6张图片

4、闭操作

先膨胀后腐蚀操作

import cv2
import numpy as np
"""
    闭操作
    先膨胀,再腐蚀
"""
img = cv2.imread('../image/caicai.jpg')
close = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel=(5,5))
cv2.imshow('close',close)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第7张图片

5、梯度运算

梯度运算:膨胀 — 腐蚀

先对图像做膨胀操作,再做腐蚀操作,然后膨胀减去腐蚀即可得到梯度运算!

import cv2
import numpy as np

"""
    梯度:膨胀-腐蚀
"""
img = cv2.imread('../image/smiledog.jpg')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(img,kernel,iterations=5)
ersion = cv2.erode(img,kernel,iterations=5)
res = np.hstack((img,dilate,ersion))
# cv2.imshow('res',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第8张图片

6、顶帽和黑帽操作

顶帽:原始输入 — 开运算结果,然后得到的是图像的噪声!

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

黑帽:闭运算 — 原始输入,得到图像内部的小孔,或者前景色中的小黑点

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

import cv2
import numpy as np

"""
    顶帽=原始输入-开运算结果(先腐蚀后膨胀,细节就被腐蚀没了,然后再膨胀)
    黑帽=闭运算(先膨胀细节就被扩大,然后再腐蚀)-原始输入(原图像的内容)
"""

#顶帽
img = cv2.imread('../image/smiledog.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel=(3,3))
# cv2.imshow('tophat',tophat)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

#黑帽
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel=(7,7))
# cv2.imshow('blackhat',blackhat)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

res = np.hstack((tophat,blackhat))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()


三、形态学处理(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽操作)_第9张图片

 结果换了条狗,结果更加明显点!

 具体的细节可能没讲到,大家可以自行度娘!

你可能感兴趣的:(opencv)