尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

OpenCV图像处理实战:形态学运算与边缘检测

OpenCV图像处理实战:形态学运算与边缘检测 前言图像形态学与边缘检测是计算机视觉领域的两大基础技术在现代图像处理和分析中扮演着至关重要的角色。形态学操作通过对图像形状进行结构化处理能够有效提取目标特征、消除噪声、分离连接物体广泛应用于目标识别、医学影像分析、工业检测等领域。边缘检测则通过识别图像中像素强度的突变区域为物体识别、场景理解、三维重建等任务提供关键特征信息。本文将系统介绍这两类技术的核心原理与OpenCV实现帮助读者掌握图像处理的基础工具。摘要本文系统介绍了图像形态学处理与边缘检测的核心概念及OpenCV实现。首先阐述了形态学的基本定义与作用详细讲解了腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽等七种基本操作并提供了完整的Python代码示例。接着深入探讨了边缘检测技术包括Sobel、Scharr、Laplacian和Canny四种经典算子通过对比分析其原理与实现差异帮助读者全面掌握图像处理中形状特征提取与边缘检测的关键技术。一、什么是形态学图像形态学是一种处理图像形状特征的图像处理技术主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。二、图像形态学有哪些2.1 图像形态学包含腐蚀膨胀开运算闭运算梯度运算顶帽和黑帽2.2Kernel核是一个小矩阵在图像上滑动通过计算覆盖区域的像素值来决定中心像素的新值。不同数值的核实现不同效果0和1做形态学处理腐蚀/膨胀有正有负做边缘检测加起来为1做模糊降噪。核的大小和形状决定了处理范围和效果。关于kernel的取值形态学核腐蚀/膨胀奇偶都行2×2精细调整没问题。卷积核模糊/边缘检测必须奇数3×3、5×5否则没有中心点锚定像素位置。2.3iterations控制形态学操作腐蚀/膨胀的执行次数相当于把同一个操作重复应用多次。2.4各个的具体代码实现图像腐蚀import cv2 import numpy as np sun cv2.imread(sun.png) cv2.imshow(yt,sun) cv2.waitKey(0) kernel np.ones((3,3),np.uint8) erosion_1 cv2.erode(sun,kernel,iterations2) cv2.imshow(erosion_1,erosion_1) cv2.waitKey(0)该代码的关键语句是erosion_1 cv2.erode(sun,kernel,iterations2)图片膨胀import cv2 import numpy as np wenzi cv2.imread(wenzi.png) cv2.imshow(yt,wenzi) cv2.waitKey(0) kernel np.ones((3,3),np.uint8) wenzi_new cv2.dilate(wenzi,kernel,iterations2) cv2.imshow(wenzi_new,wenzi_new) cv2.waitKey(0)该代码的关键语句是wenzi_new cv2.dilate(wenzi,kernel,iterations2)开运算先腐蚀后膨胀。作用:平滑物体的轮廓、断开较窄的狭颈并消除细的突出物import cv2 import numpy as np #开运算:先腐蚀后膨胀。作用:平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。 zhiwen cv2.imread(zhiwen.png) cv2.imshow(zhiwen,zhiwen) cv2.waitKey(0) kernel np.ones((3,3) ,np.uint8) zhiwen_new cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel) cv2.imshow(zhiwen_new,zhiwen_new) cv2.waitKey(0该代码的关键语句是zhiwen_new cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)闭运算先膨胀后腐蚀作用:弥合较窄的间断和细长的沟壑消除小的孔洞填补轮import cv2 import numpy as np zhiwen_duan cv2.imread(zhiwen_duan.png) cv2.imshow(zhiwen_duan,zhiwen_duan) cv2.waitKey(0) kernel np.ones((3,3) ,np.uint8) zhiwen_new cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel) cv2.imshow(zhiwen_new1,zhiwen_new) cv2.waitKey(0)该代码的关键语句是zhiwen_new cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel)梯度运算膨胀-腐蚀作用:突出显示图像中强度变化剧烈的地方#原图 import cv2 import numpy wenzi cv2.imread(wenzi.png) cv2.imshow(wenzi,wenzi) cv2.waitKey(0) #膨胀 pz_wenzi cv2.dilate(wenzi,kernel,iterations1) cv2.imshow(pz_wenzi,pz_wenzi) cv2.waitKey(0) #腐蚀 fs_wenzi cv2.erode(wenzi,kernel,iterations1) cv2.imshow(fs_wenzi,fs_wenzi) cv2.waitKey(0) #膨胀-腐蚀 gradient cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel) cv2.imshow(gradient,gradient) cv2.waitKey(0) cv2.destroyAllWindows()该代码中前三个是为了做对比的该代码的关键语句是gradient cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)顶帽 原始图像 - 开运算结果(先腐蚀后膨胀)用于提取比周围区域亮的细节。import cv2 import numpy as np sun cv2.imread(sun.png) cv2.imshow(sun_yt,sun) cv2.waitKey(0) #开运算 kernel np.ones((2,2),np.uint8) open_suncv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel) cv2.imshow(open_sun,open_sun) cv2.waitKey(0) #顶帽 tophat cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel) cv2.imshow(tophat,tophat)黑帽 闭运算(先膨胀后腐蚀)- 原始图像 用于提取比周围区域暗的细节import cv2 import numpy as np #闭运算 close_sun cv2.morphologyEx(sun,cv2.MORPH_CLOSE,kernel) cv2.imshow(close_sun,close_sun) cv2.waitKey(0) #黑帽 blackhat cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel) cv2.imshow(blackhat,blackhat) cv2.waitKey(0)三、边缘检测3.1什么是边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具通常用于特征提取和特征检测旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。3.2边缘检测包括什么Sobel算子Scharr算子Laplacian算子Canny边缘检测等其中Canny目前最常用的边缘检测算法包含高斯平滑、梯度计算、非极大值抑制、双阈值检测四个步骤效果最好。Sobel算子Sobel 算子是一种离散的微分算子该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘计算所得的是一个梯度的近似值。import cv2 yuan cv2.imread(yuan.png) cv2.imshow(yuan,yuan) cv2.waitKey(0) #x边缘sobel算子x和y要分开写 yuan_x cv2.Sobel(yuan,-1,dx 1,dy 0)#-1代表与原图深度保持一致 cv2.imshow(yuna_x,yuan_x) cv2.waitKey(0)#这种写法让结果为负的被丢失了 #仍为x边缘但是保存负数信息但是无法显示出来 yuan_x_64 cv2.Sobel(yuan,cv2.CV_64F,dx 1,dy 0) cv2.imshow(yuna_x_64,yuan_x_64) cv2.waitKey(0) #为x边缘检测但是对负数取绝对值这样可以把负数信息显示出来了 yuan_x_full cv2.convertScaleAbs(yuan_x_64) cv2.imshow(yuan_x_full,yuan_x_full) cv2.waitKey(0) #y方向边缘检测,与x的做法一样 yuan_y cv2.Sobel(yuan,-1,dx 1,dy0) cv2.imshow(yuan_y,yuan_y) cv2.waitKey(0) #y方向上保留负信息但无法显示出来 yuan_y_64 cv2.Sobel(yuan,cv2.CV_64F,dx 0,dy 1) cv2.imshow(yuan_y_64,yuan_y_64) cv2.waitKey(0) #为y边缘检测但是对负数取绝对值这样可以把负数信息显示出来了 yuan_y_full cv2.convertScaleAbs(yuan_y_64) cv2.imshow(yuan_y_full,yuan_y_full) cv2.waitKey(0) #将x和y图像进行结合 yuan_xy_full cv2.addWeighted(yuan_x_full,1,yuan_y_full,1,0) cv2.imshow(yuan_xy_full,yuan_xy_full) cv2.waitKey(0)在用Sobel算子进行边缘检测时可不写yuan_x和yuan_y代码写这两部分是方便理解进行步步推进Scharr算子Scharr 算子是 Soble 算子在 ksize3 时的优化与 Soble 的速度相同且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分其中心元素占的权重更重相当于使用较小标准差的高斯函数也就是更瘦高的模板。import cv2 xwz cv2.imread(xwz.jpg,0) xwz cv2.resize(xwz,(400,400)) cv2.imshow(yt,xwz) cv2.waitKey(0) #Scharr算子跟sobel算子一样都需要进行先转64再取绝对值 xwz_x_64 cv2.Scharr(xwz,cv2.CV_64F,dx1,dy 0) xwz_x_full cv2.convertScaleAbs(xwz_x_64) xwz_y_64 cv2.Scharr(xwz,cv2.CV_64F,dx0,dy 1) xwz_y_full cv2.convertScaleAbs(xwz_y_64) xwz_xy_full cv2.addWeighted(xwz_x_full,1,xwz_y_full,1,0) cv2.imshow(xwz_xy_full,xwz_xy_full) cv2.waitKey(0)Laplacian算子Laplacian算子不再以x和y的方向计算而是以圆方向计算变化率。因此不需要GxGy。Laplacian,不需要xy分开算,但是也需要把负数保留然后通过绝对值import cv2 xwz_lap cv2.Laplacian(xwz,cv2.CV_64F,ksize 3) xwz_lap_full cv2.convertScaleAbs(xwz_lap) cv2.imshow(xwz_lap_full,xwz_lap_full)Canny边缘检测低错误率。因为一般的边缘检测算子可能存在检测到伪边缘的情况因此Canny算法检测到的边缘尽可能地是真实的边缘。 较好地定位边缘点。由检测器标记的边缘点与真实边缘点中心尽可能地接近。 单一的边缘响应。图像中的边缘只标记出一次。#canny边缘算法 xwz_canny cv2.Canny(xwz,100,150) cv2.imshow(xwz_canny,xwz_canny) cv2.waitKey(0)总结本文系统介绍了图像形态学处理的七种基本操作和四种经典边缘检测算子为读者提供了完整的理论框架和实践指南。形态学操作核心要点回顾腐蚀与膨胀形态学的基础操作分别用于缩小和扩大目标区域是其他复合操作的基础。开运算与闭运算开运算先腐蚀后膨胀用于消除细小物体、平滑边界闭运算先膨胀后腐蚀用于填充小孔、连接邻近物体。梯度运算通过膨胀与腐蚀的差值突出边缘区域用于边缘检测。顶帽与黑帽顶帽用于提取比背景亮的细节黑帽用于提取比背景暗的细节常用于背景不均匀的图像处理。边缘检测算子对比Sobel算子经典的梯度算子计算简单但精度有限需分别计算x和y方向梯度。Scharr算子Sobel算子的优化版本在3×3核下精度更高计算复杂度相同。Laplacian算子二阶微分算子对噪声敏感但能检测各方向边缘无需分离计算。Canny算子目前最常用的边缘检测算法通过多步骤处理实现低错误率、精确定位和单一边缘响应。进一步学习方向读者在掌握本文内容后可以进一步探索以下方向参数调优实践针对不同应用场景调整核大小、迭代次数、阈值等参数观察处理效果变化。组合应用将形态学操作与边缘检测结合使用如先进行形态学预处理再执行边缘检测提升特征提取质量。实际项目应用在目标检测、医学影像分析、工业质检等实际项目中应用所学技术解决具体问题。算法优化了解不同算子的计算复杂度学习GPU加速、并行计算等优化技术。深度学习结合探索传统图像处理技术与深度学习方法的结合如使用形态学操作进行数据增强。通过不断实践和探索读者将能够更深入地理解图像处理技术的本质并在实际项目中灵活运用这些工具解决复杂问题。
返回列表