栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

形态学操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

形态学操作

· 形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,顶帽运算,黑帽运算,击中击不中

腐蚀

将图像的边界点消除,使图像沿着边界向内收敛,也可以将小于指定结构体元素的部分去除

dst=cv2.erode(src,kernel,(-1,-1),迭代次数)

其中kernel可以自定义生成,也可以通过函数cv2.getStructuringElement()生成

import cv2
import numpy as np

img=np.zeros((5,5),dtype=np.uint8)
img[1:4,1:4]=1

print("imgn",img)

kernel=np.ones((3,1),np.uint8)

print("kerneln",kernel)

rst=cv2.erode(img,kernel)

print("rstn",rst)
img
 [[0 0 0 0 0]
 [0 1 1 1 0]
 [0 1 1 1 0]
 [0 1 1 1 0]
 [0 0 0 0 0]]
kernel
 [[1]
 [1]
 [1]]
rst
 [[0 0 0 0 0]
 [0 0 0 0 0]
 [0 1 1 1 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
import cv2
import numpy as np

img=cv2.imread("D:/1.jpg")

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

rst=cv2.erode(img,kernel,iterations=2)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

使用更大的核,更多的迭代次数,图像腐蚀就越严重


膨胀

对图像的边界进行扩张,如果图像内两个对象的距离较近,那么在膨胀过程中,两个对象可能会连通在一起

dst=cv2.dilate(src,kernel,(-1,-1),迭代次数)
import cv2
import numpy as np

img=np.zeros((5,5),np.uint8)
img[2:3,1:4]=1
print("imgn",img)

kernel=np.ones((3,1),np.uint8)
print("kerneln",kernel)

rst=cv2.dilate(img,kernel)

print("rstn",rst)
img
 [[0 0 0 0 0]
 [0 0 0 0 0]
 [0 1 1 1 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
kernel
 [[1]
 [1]
 [1]]
rst
 [[0 0 0 0 0]
 [0 1 1 1 0]
 [0 1 1 1 0]
 [0 1 1 1 0]
 [0 0 0 0 0]]
import cv2
import numpy as np

img=cv2.imread("D:/2.jpg")

kernel=np.ones((9,9),np.uint8)

rst=cv2.dilate(img,kernel)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

通用形态学函数
dst=cv2.morphologyEx(src,op,kernel,(-1,-1),迭代次数)

其中op表示操作类型,有以下几种

  • 腐蚀 cv2.MORPH_ERODE
  • 膨胀 cv2.MORPH_DILATE
  • 开运算 cv2.MORPH_OPEN
  • 闭运算 cv2.MORPH_CLOSE
  • 形态学梯度运算 cv2.MORPH_GRADIENT
  • 顶帽运算 cv2.MORPH_TOPHAT
  • 黑帽运算 cv2.MORPH_BLACKHAT
  • 击中击不中 cv2.MORPH_HITMISS

开运算(先腐蚀后膨胀)

作用:去噪,计数

import cv2
import numpy as np

img=cv2.imread("D:/3.jpg")

kernel=np.ones((10,10),np.uint8)

rst=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=1)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

闭运算(先膨胀后腐蚀)

作用:关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接

import cv2
import numpy as np

img=cv2.imread("D:/4.jpg")

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

rst=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=5)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

形态学梯度运算(膨胀图像-腐蚀图像)
import cv2
import numpy as np

img=cv2.imread("D:/2.jpg")

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

rst=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel,iterations=2)


cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽运算(原始图像-开运算图像)

作用:获取图像的噪声信息或者得到比原始图像边缘更亮的边缘信息

import cv2
import numpy as np

img=cv2.imread("D:/3.jpg")

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

rst=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel,iterations=2)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽运算(闭运算图像-原始函数图像)

作用:获取图像内部的小孔,或者前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分

import cv2
import numpy as np

img=cv2.imread("D:/hjb.jpg")

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

rst=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel,iterations=2)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

核函数

对于kernel,可以自定义生成,也可以通过cv2.getStructuringElement()构造

retval=cv2.getStructuringElement(shape,kisze,(-1,-1))
  • cv2.MORPH_RECT 矩形1
  • cv2.MORPH_CROSS 十字形1
  • cv2.MORPH_ELLIPSE 椭圆形1

观察不同的核

import cv2
import numpy as np

kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

kernel2=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

kernel3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

print("kernel1:n",kernel1)
print("kernel2:n",kernel2)
print("kernel3:n",kernel3)
kernel1:
 [[1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]]

kernel2:
 [[0 0 1 0 0]
 [0 0 1 0 0]
 [1 1 1 1 1]
 [0 0 1 0 0]
 [0 0 1 0 0]]

kernel3:
 [[0 0 1 0 0]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [0 0 1 0 0]]

观察不同核对形态学操作的影响

import cv2

kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(59,59))

kernel2=cv2.getStructuringElement(cv2.MORPH_CROSS,(59,59))

kernel3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(59,59))

img=cv2.imread("D:/3.jpg")

rst1=cv2.dilate(img,kernel1,iterations=1)
rst2=cv2.dilate(img,kernel2,iterations=1)
rst3=cv2.dilate(img,kernel3,iterations=1)

cv2.imshow("img",img)
cv2.imshow("rst1",rst1)
cv2.imshow("rst2",rst2)
cv2.imshow("rst3",rst3)

cv2.waitKey(0)
cv2.destroyAllWindows()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号