通过阈值化分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽运算和底帽运算。
1. 腐蚀
腐蚀操作类似于中值平滑,也有一个核,但不进行卷积运算,而是取核中像素值的最小值代替锚点位置的像素值,这样就会使图像中较暗的区域面积增大,较亮的的区域面积减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色变小,就像被腐蚀了一样。
#coding:utf-8
import cv2 as cv
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
dst = cv.erode(img_thr,kernel,iterations=1)
cv.imshow("img",img)
cv.imshow("img_thr",img_thr)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
cv2.erode()
是 OpenCV 中用于进行腐蚀操作的函数。腐蚀是形态学操作的一种,它通过在图像中滑动结构元素(kernel)来减小图像中的白色区域(前景对象)。它常常被用于去除图像中的小白色噪声或者分离两个连接在一起的物体。 (白色的目标变小,相反黑色的目标变大),腐蚀操作将减小图像中的白色区域,可以用于去除小的白色噪声或者分离连接在一起的物体。
基本语法如下:
erosion = cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
参数说明:
src
: 输入图像,单通道二进制图像(黑白图像)。kernel
: 结构元素,可以使用cv2.getStructuringElement()
创建。dst
(可选): 输出图像。anchor
(可选): 结构元素的锚点,默认为(-1, -1)
表示结构元素的中心。iterations
(可选): 腐蚀的迭代次数,默认为1。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_CONSTANT
。borderValue
(可选): 边界的填充值,默认为0。
2.膨胀
膨胀操作和腐蚀操作正好相反,是取核中像素值的最大值代替锚点位置的像素值,这样会使图像中较亮的区域增大,较暗的区域减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色面积变大,就像膨胀了一样。
#coding:utf-8
import cv2 as cv
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
dst = cv.dilate(img_thr,kernel,iterations=1)cv.imshow("img",img)
cv.imshow("img_thr",img_thr)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
cv2.dilate()
是 OpenCV 中用于进行膨胀操作的函数。膨胀是形态学操作的一种,它通过在图像中滑动结构元素(kernel)来增加图像中的白色区域(前景对象)。膨胀操作将增加图像中的白色区域,膨胀常常被用于连接图像中的白色区域或者扩展物体的大小。
基本语法如下:
dilation = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
参数说明:
src
: 输入图像,单通道二进制图像(黑白图像)。kernel
: 结构元素,可以使用cv2.getStructuringElement()
创建。dst
(可选): 输出图像。anchor
(可选): 结构元素的锚点,默认为(-1, -1)
表示结构元素的中心。iterations
(可选): 膨胀的迭代次数,默认为1。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_CONSTANT
。borderValue
(可选): 边界的填充值,默认为0。
3.开运算,闭运算,顶帽,顶帽
- 开运算:先进行腐蚀操作,后进行膨胀操作,主要用来去除一些较亮的部分,即先腐蚀掉不要的部分,再进行膨胀。
- 闭运算:先进行膨胀操作,后进行腐蚀操作,主要用来去除一些较暗的部分。
- 形态学梯度:膨胀运算结果减去腐蚀运算结果,可以拿到轮廓信息。
- 顶帽运算:原图像减去开运算结果。
- 底帽运算:原图像减去闭运算结果。
#coding:utf-8
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#cv2.cvtColor() 是 OpenCV 中用于进行颜色空间转换的函数。颜色空间转换是图像处理中常见的操作,用于将图像从一种颜色表示转换为另一种。常见的颜色空间包括灰度空间、RGB空间、HSV空间等。
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
open = cv.morphologyEx(img_thr,cv.MORPH_OPEN,kernel,iterations=1)
#cv2.morphologyEx()是OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。cv2.MORPH_OPEN: 开运算(先腐蚀后膨胀。
close = cv.morphologyEx(img_thr,cv.MORPH_CLOSE,kernel,iterations=1)
#cv2.morphologyEx()是OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。cv2.MORPH_CLOSE: 闭运算(先膨胀后腐蚀)
gradient = cv.morphologyEx(img_thr,cv.MORPH_GRADIENT,kernel,iterations=1)
#cv2.MORPH_GRADIENT: 梯度运算(膨胀图减去腐蚀图)。
tophat = cv.morphologyEx(img_thr,cv.MORPH_TOPHAT,kernel,iterations=1)
#cv2.MORPH_TOPHAT: 顶帽运算(原始图像减去开运算图像)。
blackhat = cv.morphologyEx(img_thr,cv.MORPH_BLACKHAT,kernel,iterations=1)
#cv2.MORPH_BLACKHAT: 黑帽运算(闭运算图像减去原始图像)。
images=[img_thr,open,close,gradient,tophat,blackhat]
titles=["img_thr","open","close","gradient","tophat","blackhat"]
for i in range(6):plt.subplot(2,3,i+1),plt.imshow(images[i],"gray")plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()
cv2.morphologyEx()
是 OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。
基本语法如下:
dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
参数说明:
src
: 输入图像。op
: 形态学操作的类型,可以是以下之一:cv2.MORPH_OPEN
: 开运算(先腐蚀后膨胀)。cv2.MORPH_CLOSE
: 闭运算(先膨胀后腐蚀)。cv2.MORPH_GRADIENT
: 梯度运算(膨胀图减去腐蚀图)。cv2.MORPH_TOPHAT
: 顶帽运算(原始图像减去开运算图像)。cv2.MORPH_BLACKHAT
: 黑帽运算(闭运算图像减去原始图像)。
kernel
: 结构元素,可以使用cv2.getStructuringElement()
创建。dst
(可选): 输出图像。anchor
(可选): 结构元素的锚点,默认为(-1, -1)
表示结构元素的中心。iterations
(可选): 迭代次数,默认为1。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_CONSTANT
。borderValue
(可选): 边界的填充值,默认为0。