Python中图像边缘检测算法如何实现(python,开发技术)

时间:2024-05-09 14:37:53 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,例如

    importcv2importnumpyasnpimportmatplotlib.pyplotaspltDetector=EdgeDetect('1.jpg')Prewitt=Detector.prewitt()plt.imshow(Prewitt,'gray')plt.show()

    这个类的构造函数为

    classEdgeDetect:def__init__(self,img)->None:self.src=cv2.imread(img)self.gray=cv2.cvtColor(self.src,cv2.COLOR_BGR2GRAY)

    读取的是图像的基本信息。

    1.一阶微分算子

    图像边缘是数字图像的高频成分,对应图像梯度的极值。在二维离散数字图像上,某个方向上图像强度函数微分使用有限差分法来近似,即:

    Python中图像边缘检测算法如何实现

    因此图像边缘检测即是对图像的差分运算。

    1.1 Prewitt算子

    Prewitt算子本质上就是x或y方向上相邻像素的差分。

    Python中图像边缘检测算法如何实现

    那我们常说的图像梯度是什么意思呢?

    其实就是用x与y方向上相邻像素的差分为方向的向量

    Python中图像边缘检测算法如何实现

    在编程实现上,就是构造上图的两个方向的滤波算子,然后将x xx、y yy两个方向的边缘合成就是整张图各方向的边缘检测结果

    defprewitt(self):#Prewitt算子kernelX=np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)kernelY=np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)#对图像滤波x=cv2.filter2D(self.gray,cv2.CV_16S,kernelX)y=cv2.filter2D(self.gray,cv2.CV_16S,kernelY)#转uint8,图像融合absX=cv2.convertScaleAbs(x)absY=cv2.convertScaleAbs(y)returncv2.addWeighted(absX,0.5,absY,0.5,0)

    Python中图像边缘检测算法如何实现

    1.2 Sobel算子

    对高斯核函数x、y方向求导,并将其模板化即得Sobel算子。Sobel算子相比于Prewitt算子有更强的抗噪能力,因为其结合了高斯滤波的效果。

    Python中图像边缘检测算法如何实现

    在编程实现上,就是构造上图的两个方向的滤波算子,然后将x、y两个方向的边缘合成就是整张图各方向的边缘检测结果

    defsobel(self):#Sobel算子kernelX=np.array([[1,2,1],[0,0,0],[-1,-2,-1]],dtype=int)kernelY=np.array([[-1,-2,-1],[0,0,0],[1,2,1]],dtype=int)#对图像滤波x=cv2.filter2D(self.gray,cv2.CV_16S,kernelX)y=cv2.filter2D(self.gray,cv2.CV_16S,kernelY)#转uint8,图像融合absX=cv2.convertScaleAbs(x)absY=cv2.convertScaleAbs(y)returncv2.addWeighted(absX,0.5,absY,0.5,0)

    Python中图像边缘检测算法如何实现

    2.二阶微分算子

    2.1 Laplace算子

    将Laplace算子

    Python中图像边缘检测算法如何实现

    写成差分方程形式为

    Python中图像边缘检测算法如何实现

    将差分方程进一步写成卷积核形式如图(a),可将其扩展为图(b)使之具有各向同性。微分算子属于高通滤波,在锐化边缘的同时也增强了噪点,因此Laplace算子抗噪能力弱,且不能检测边缘方向。

    Python中图像边缘检测算法如何实现

    在编程实现上,就是构造上图的滤波算子

    #Laplace算子deflaplace(self):kernel=np.array([[0,-1,0],[-1,4,-1],[0,-1,0]],dtype=int)img=cv2.filter2D(self.gray,cv2.CV_16S,kernel)returncv2.convertScaleAbs(img)

    Python中图像边缘检测算法如何实现

    2.2 LoG算子

    为克服Laplace算子抗噪能力弱这一问题,引入高斯-拉普拉斯算子(LoG, Laplace of Gaussian),即先低通滤除噪声,再高通强化边缘,LoG算子本质上是带通滤波器。

    Python中图像边缘检测算法如何实现

    在编程实现上,就是构造上图的滤波算子

    #LoG算子defLoG(self):kernel=np.array([[0,0,1,0,0],[0,1,2,1,0],[1,2,-16,2,1],[0,1,2,1,0],[0,0,1,0,0]],dtype=int)img=cv2.filter2D(self.gray,cv2.CV_16S,kernel)returncv2.convertScaleAbs(img)

    Python中图像边缘检测算法如何实现

    3.Canny边缘检测

    Canny边缘检测算法可以分为以下步骤。

    • 使用Sobel算子滤除原图像噪声,并得到梯度图;

    • 应用非极大值抑制(Non-Maximum Suppression, NMS)以消除边缘检测、目标检测带来的杂散响应,即对待测边缘或目标,应尽可能有唯一的准确响应

    • 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

    使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。

    Python中图像边缘检测算法如何实现

    阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即

    Python中图像边缘检测算法如何实现

    通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。

    下面是Canny边缘检测算法的效果。

    Python中图像边缘检测算法如何实现

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:Python中图像边缘检测算法如何实现的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:C++强制类型转换的方法下一篇:

    25 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18