一阶微分算子边缘检测算法

1、Roberts算子

适合处理声噪较低的图片,缺点:对图片的定位不太准,提取的边缘线条比较粗;通过cv2.filte(src,ddepth,kernel,[dst[,anchor,[delta[,borderType]]])实现卷积运算;

垂直方向w1与水平方向w2

ddepth:图像深度:图像深度是指图像中每个像素的颜色表示所需的位数。它决定了每个像素可能有的颜色数和灰度级别,也影响了图像的质量和细节表现能力。

delta:表示的是一个偏移量,通常在像素值的更改或者是数据的平移上使用。

通过cv2.convertScaleAbs()函数实现将数值转化为8位无符号整型;

import cv2

import numpy as np

img=cv2.imread('img.png')

gray =cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

kernelx =np.array([[1,0],[0,-1]],dtype=int)

kernely =np.array([[0,1],[-1,0]],dtype=int)

x1 =cv2.filter2D(gray,cv2.CV_16S,kernelx)#卷积运算

Y1 =cv2.filter2D(gray,cv2.CV_16S,kernely)

absX1=cv2.convertScaleAbs(x1)#数值转化

absY1=cv2.convertScaleAbs(Y1)

Roberts = cv2.addWeighted(absX1,0.5,absY1,0.5,gamma=0) # 实现两个图像融合,

cv2.imshow('Roberts', Roberts)

cv2.waitKey(0)

gamma:修正系数大于1,会增加饱和度,使图像的色彩更鲜明; 修正系数小于1,会减小饱和度,使图像看起来比较平淡。

2、Prewitt算子

原理是通过利用特定区域的像素灰度值产生的差分实现边缘检测。适合用来识别噪声较多、灰度渐变的图像边缘。

垂直方向w1与水平方向w2

img=cv2.imread('img.png')

gray =cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

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)

x1 =cv2.filter2D(gray,cv2.CV_16S,kernelx)

Y1 =cv2.filter2D(gray,cv2.CV_16S,kernely)

absX1=cv2.convertScaleAbs(x1)

absY1=cv2.convertScaleAbs(Y1)

image= cv2.addWeighted(absX1,0.5,absY1,0.5,0)

cv2.imshow('image', image)

cv2.waitKey(0)

3、Sobel算子

较为常用,多用于噪声较多,灰度渐变

cv2.Soble();

img=cv2.imread('img.png')

gray =cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

x1 =cv2.Sobel(gray,cv2.CV_16S,1,0)

Y1 =cv2.Sobel(gray,cv2.CV_16S,0,1)

absX1=cv2.convertScaleAbs(x1)

absY1=cv2.convertScaleAbs(Y1)

image= cv2.addWeighted(absX1,0.5,absY1,0.5,0)

cv2.imshow('image', image)

cv2.waitKey(0)

4、Canny算子

具有很好的边缘检测性能,选择灰度强度变化最强的位置。

需要先对图片进行降噪,否则可能会在边缘检测中被识别为边缘

cv2.Canny();

img=cv2.imread('img.png')

gray =cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

gaus =cv2.GaussianBlur(gray,(5,5),0)

image = cv2.Canny(gaus,100,200)

cv2.imshow('image', image)

cv2.waitKey(0)

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: