当前位置: 首页 > news >正文

opencv-形态学处理

通过阈值化分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽运算和底帽运算。
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.开运算,闭运算,顶帽,顶帽

  1. 开运算:先进行腐蚀操作,后进行膨胀操作,主要用来去除一些较亮的部分,即先腐蚀掉不要的部分,再进行膨胀。
  2. 闭运算:先进行膨胀操作,后进行腐蚀操作,主要用来去除一些较暗的部分。
  3. 形态学梯度:膨胀运算结果减去腐蚀运算结果,可以拿到轮廓信息。
  4. 顶帽运算:原图像减去开运算结果。
  5. 底帽运算:原图像减去闭运算结果。
 #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。

相关文章:

  • postman打开白屏
  • Java实现王者荣耀小游戏
  • 【Openstack Train安装】九、Nova安装
  • C语言——求π的近似值
  • [栈思想]后缀表达式
  • Altium Designer学习笔记13
  • 【Linux】Linux中git的基本使用(三板斧)
  • 用Sublime编写Lua脚本
  • 详细讲解1.js处理日期对象输出标准的“2000年12月22日 周三“ 的格式
  • 软著项目推荐 深度学习卷积神经网络的花卉识别
  • c语言练习12周(15~16)
  • 莱佛士学生成功入围2023Harper‘s BAZAAR NewGen Award六强
  • leetCode 100. 相同的树 和 leetCode 101. 对称二叉树 和 110. 平衡二叉树 和 199. 二叉树的右视图
  • 额,收到阿里云给的赔偿了!
  • 模拟退火算法应用——求解TSP问题
  • 【Python基础】协程(迭代器、生成器、协程、gevent介绍)
  • EASYEXCEL(一)
  • 有一种浪漫,叫接触Linux
  • 面试:ShardingSphere问题
  • 服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 98年服装“厂二代”:关税压力下,我仍相信中国供应链|湃客Talk
  • A股低开高走全线上涨:军工股再度领涨,两市成交12934亿元
  • 全国铁路五一假期累计发送1.51亿人次,多项运输指标创历史新高
  • 央行:5月15日起下调金融机构存款准备金率0.5个百分点
  • 上海虹桥高铁站拦门事件反转,谁在带偏网友?