A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容来自OpenCV-Python Tutorials 自己翻译整理

目标
腐蚀膨胀、开闭运算
使用这三个函数cv2.erode(),cv2.dilate(),cv2.morphologyEx()

原理
一般对二值化图像进行形态学转换操作。输入的第一个参数为原始图像;第二个参数为结构化元素(核),该参数决定操作性质。两个基本形态学操作是腐蚀膨胀,衍生出了开运算、闭运算、梯度运算等等

腐蚀
腐蚀操作会把前景物体的边缘腐蚀掉。原理是卷积核沿着图像滑动,如果与卷积核对应的原图像像素值都是1,那么中心元素保持原值,否则为0.
效果,靠近前景的像素被腐蚀为0,前景物体变小,图像白色区域减少,对于去除白噪声很有用,可以断开两个连接在一起的物体。
(图像当中的白噪声大概意思就是随机噪声)

如下5*5的卷积核

import cv2
import numpy as np

img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 2)

cv2.imshow('img',img)
cv2.imshow('ero',erosion)

cv2.waitKey(0)

左侧为腐蚀后的图像,iterations为迭代运算次数

膨胀
与腐蚀相反,卷积核当中只要有一个值是1,中心元素值就是1。此操作会增加前景中的白色区域,一般早去噪声的时候都是先腐蚀再膨胀,腐蚀的过程会使得前景变小,使用膨胀操作使前景变换回来。膨胀也可以使相互分离的物体连接。

import cv2

import numpy as np


img = cv2.imread('9.jpg',0)

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

dilation = cv2.dilate(img,kernel,iterations = 1)


cv2.imshow('img',img)

cv2.imshow('dil',dilation)


cv2.waitKey(0)


左边为膨胀

开运算
就是先腐蚀再膨胀,一般用来去除噪声

函数是 cv2.morphologyEx()

import cv2

import numpy as np


img = cv2.imread('9.jpg',0)

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


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


cv2.imshow('img',img)

cv2.imshow('opening',opening)


cv2.waitKey(0)

结果略


闭运算


先膨胀再腐蚀,一般用来填充黑色的小像素点


import cv2

import numpy as np


img = cv2.imread('9.jpg',0)

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

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)


cv2.imshow('img',img)

cv2.imshow('closing',closing)



cv2.waitKey(0)

形态学梯度

此为膨胀和腐蚀的差别,结果为前景轮廓

import cv2

import numpy as np


img = cv2.imread('9.jpg',0)

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

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)


cv2.imshow('img',img)

cv2.imshow('gradient',gradient)


cv2.waitKey(0)

礼帽

原始图像与开运算图像的差

import cv2

import numpy as np


img = cv2.imread('9.jpg',0)

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

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)


cv2.imshow('img',img)

cv2.imshow('tophat',tophat)


cv2.waitKey(0)

黑帽


闭运算与原始图像的差(注意是闭运算减去原始图像,与礼帽不相反)


blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

1

结构化元素

前面使用numpy构建结构化元素,都是正方形的核。如果要构建圆形或者椭圆形的核,可以使用 cv2.getStructuringElement()函数。

参数填入形状和大小


# 矩形核

>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

array([[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]], dtype=uint8)


# 椭圆形核

>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

array([[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]], dtype=uint8)


# 十字形核

>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

array([[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]], dtype=uint8)


5 个回复

倒序浏览
奈斯,优秀
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马