多语言展示
当前在线:1122今日阅读:162今日分享:23

python下利用opencv进行梯度计算

梯度计算经常在边缘检测,通过判别灰度变化的程度和方向,从而判断是否存在边缘。常用的有sobel , 拉普拉斯等方法,现在介绍Scharr方法实现梯度计算,它和sobel很向,但是算子核不同。
工具/原料
1

opencv+python

2

pycharm+win7

方法/步骤
1

梯度就是通过对二维离散函数求导,它在边缘上的灰度变化,可以通过梯度方向的最大变化率进行表达,通过求导得出梯度变化方向和幅值等信息。3x3 Scharr滤波器一般比3x3 Sobel滤波器效果好。结合了高斯平滑与微分。其算子如图。

2

首先还是先计算 x,y两个方向Scharr,然后进行绝对值,因为前面变成浮点数,求导后可能出现负值。import cv2  as cvimport  numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimage = cv.imread('c:\\dajiangdahe.png', 1)scharr_y = cv.Scharr(image,cv.CV_64F,dx=0,dy=1)scharr_x = cv.Scharr(image,cv.CV_64F,dx=1,dy=0)scharr_x = cv.convertScaleAbs(scharr_x)scharr_y = cv.convertScaleAbs(scharr_y)

3

然后把2个方向的计算数值通过addWeighted整合为最后结果。scharrOver = cv.addWeighted(scharr_x,0.5,scharr_y,0.5,0)cv.imshow('image',image)cv.imshow('scharr_x',scharr_x)cv.imshow('scharr_y',scharr_y)cv.imshow('picture',scharrOver)cv.waitKey()

4

再举个例子看得比较清楚。还是采用米框图image = cv.imread('c:\\color_MiLine.png', 1)scharr_x = cv.Scharr(image,cv.CV_64F,dx=1,dy=0)scharr_x = cv.convertScaleAbs(scharr_x)scharr_y = cv.Scharr(image,cv.CV_64F,dx=0,dy=1)scharr_y = cv.convertScaleAbs(scharr_y)scharrOver = cv.addWeighted(scharr_x,0.5,scharr_y,0.5,0)cv.imshow('image',image)cv.imshow('scharr_x',scharr_x)cv.imshow('scharr_y',scharr_y)cv.imshow('picture',scharrOver)cv.waitKey()cv.destroyAllWindows()

5

分别输出三种图像进行观察cv.imshow('image',image)cv.imshow('scharr_x',scharr_x)cv.imshow('scharr_y',scharr_y)cv.imshow('picture',scharrOver)cv.waitKey()cv.destroyAllWindows()

6

通过计算可以检测边缘,效果还可以

注意事项
1

convertScaleAbs 还是要有,否则容易有问题

2

Scharr函数进行求梯度计算

推荐信息