• 大小: 25KB
    文件类型: .docx
    金币: 1
    下载: 0 次
    发布日期: 2021-08-08
  • 语言: 其他
  • 标签: opencv  

资源简介

#图像梯度
(注意都需要cv.convertScaleAbs将得到的有些负值取绝对值得到正数,并将数据转化到0-255之间,且sobel与Scarr算法中的数据位数都是32位浮点型的)
import cv2 as cv
import numpy as np

def sobel_demo(image):
#注意是32位float数据
grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)
grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)
#当用sobel算子不能很好的得到边缘的时候,就可以用Scharr算子,这是加强版的sobel算子,就可以得到
#原图像不是很明显的边缘了
# grad_x =cv.Sobel(image,cv.CV_32F,1,0)
# grad_y =cv.Sobel(image,cv.CV_32F,0,1)
gradx =cv.convertScaleAbs(grad_x)
grady = cv.convertScaleAbs(grad_y)
#cv.imshow("gradx",gradx)
#cv.imshow("grady",grady)
dst = cv.addWeighted(gradx,0.5,grady,0.5,0)
cv.imshow("sobel_demo",dst)

def lapalace_demo(image):
#dst =cv.Laplacian(image,cv.CV_32F)
#dst =cv.convertScaleAbs(dst) 会把dst变成单通道的8位的0-255的图像
#也可以用filter2D来做拉普拉斯算子
kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]])
dst = cv.filter2D(image,cv.CV_32F,kernel)
dst = cv.convertScaleAbs(dst)
cv.imshow("lapalace",dst)


src = cv.imread("E:/opencv/picture/step.jpg")
cv.imshow("inital_window",src)
#sobel_demo(src)
lapalace_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
分析:
图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。
一、 Sobel算子是普通一阶差分,是基于寻找梯度强度。拉普拉斯算子(二阶差分)是基于过零点检测。通过计算梯度,设置阀值,得到边缘图像。

def sobel_demo(image):
#注意是32位float数据
grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)
grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)
#当用sobel算子不能很好的得到边缘的时候,就可以用Scharr算子,这是加强版的sobel算子,就可以得到
#原图像不是很明显的边缘了
# grad_x =cv.Sobel(image,cv.CV_32F,1,0)
# grad_y =cv.Sobel(image,cv.CV_32F,0,1)
gradx = cv.convertScaleAbs(grad_x)
grady = cv.convertScaleAbs(grad_y)
#cv.imshow("gradx",gradx)
#cv.imshow("grady",grady)
dst = cv.addWeighted(gradx,0.5,grady,0.5,0)
cv.imshow("sobel_demo",dst)

1.Sobel算子用来计算图像灰度函数的近似梯度。Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
2.Sobel具有平滑和微分的功效。即:Sobel算子先将图像横向或纵向平滑,然后再纵向或横向差分,得到的结果是平滑后的差分结果。
Ope

资源截图

代码片段和文件信息

评论

共有 条评论