目录
1.提要:
2.Sobel算子:
3.Scharr算子
4.Laplace算子
5.算子的相关实现
这几个算子是用图像梯度,解决图像处理中如图像边界的寻找和确定、的相关问题。
Sobel 算子是一个离散微分算子。 它计算图像强度函数梯度的近似值。Sobel 算子结合了高斯平滑和微分。在计算Sobel算子的时候要进行水平和垂直两个方向上进行梯度检测,水平变化:
其中,左边部分为3*3的卷积核函数,因为奇数的核函数锚点比较容易得到,所以一般选择3*3这样的,I里面的内容就是图片的像素的rgb值,通常在0-255直之间。两者相乘得到的内积取绝对值后得到横向变化的值。垂直方向也一样:
最后把得到的Gx和Gy相加得到最后值:
当kernel内核的大小为 3 时,上面显示的 Sobel 内核可能会产生明显的不准确(毕竟,Sobel 只是导数的近似值)。 OpenCV 通过使用 Scharr() 函数解决了大小为 3 的内核的这种不准确性。 这与标准 Sobel 函数一样快但更准确,使用方法与上面的类似:
拉普拉斯算子是二阶微分线性算子,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。其核函数如下
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
# img = cv2.imread(r'E:\iu.png') # 读取方式默认为BGR
# cv_show('image',img)
#灰度图读取
img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
# cv_show('image2',img2)
# print(img.size)#像素点个数
# print(img.shape) #图像维度
sobelx = cv2.Sobel(img2,cv2.CV_64F,0,1,ksize=3)#水平Gx
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img2, cv2.CV_64F, 1, 0, ksize=3) # 垂直Gy
sobely = cv2.convertScaleAbs(sobely)
cv_show('sobelx',cv2.addWeighted(sobelx,0.5,sobely,0.5,0))#相加两者权重各位0.5,0是偏置项
结果:
代码:
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
# img = cv2.imread(r'E:\iu.png') # 读取方式默认为BGR
# cv_show('image',img)
#灰度图读取
img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
# cv_show('image2',img2)
# print(img.size)#像素点个数
# print(img.shape) #图像维度
scharrx = cv2.Scharr(img2,cv2.CV_64F,0,1)#水平Gx
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img2, cv2.CV_64F, 1, 0) # 垂直Gy
scharry = cv2.convertScaleAbs(scharry)
cv_show('scharr',cv2.addWeighted(scharrx,0.5,scharry,0.5,0))#相加两者权重各位0.5,0是偏置项
结果:
代码:
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
# img = cv2.imread(r'E:\iu.png') # 读取方式默认为BGR
# cv_show('image',img)
#灰度图读取
img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
# cv_show('image2',img2)
# print(img.size)#像素点个数
# print(img.shape) #图像维度
# scharrx = cv2.Scharr(img2,cv2.CV_64F,0,1)#水平Gx
# scharrx = cv2.convertScaleAbs(scharrx)
# scharry = cv2.Scharr(img2, cv2.CV_64F, 1, 0) # 垂直Gy
# scharry = cv2.convertScaleAbs(scharry)
# cv_show('scharr',cv2.addWeighted(scharrx,0.5,scharry,0.5,0))#相加两者权重各位0.5,0是偏置项
Laplacian = cv2.Laplacian(img2,cv2.CV_64F)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv_show('laplacian', Laplacian)
结果:
最后大家自行对比结果,图片是随便找的,大家也可以替换