页首 HTML 代码

05 梯度处理

梯度

梯度计算是:在某个通道内,计算某个像素点和周围(水平,垂直,四周...)的像素的亮度差异的大小,不同的算子代表不同的计算方式

算子

Sobel算子 一种常用的算子

\[Gx = \begin{bmatrix} {{-1}}&{{0}}&{{1}}\\ {{-2}}&{{0}}&{{2}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

\[Gy = \begin{bmatrix} {{-1}}&{{-2}}&{{-1}}\\ {{0}}&{{0}}&{{0}}\\ {{1}}&{{2}}&{{1}}\\ \end{bmatrix}\]

\[Gxy = \begin{bmatrix} {{1}}&{{0}}&{{-1}}\\ {{0}}&{{0}}&{{0}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

边缘点

\[G =2 \begin{bmatrix} {{-1}}&{{0}}&{{1}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

\[G =2 \begin{bmatrix} {{-1}}&{{-1}}\\ {{0}}&{{0}}\\ {{1}}&{{1}}\\ \end{bmatrix}\]

Sobel算子一般取3X3矩阵(可以自由指定),它会用它的中心遍历每个通道的图像中的每个像素点,并进行运算(对应位置相乘,并相加),得到的结果作为该像素点的亮度值

对于Gx右边的值 减去 左边的值.
权重: 在水平方向,靠近中心点(目标像素点)的权重为2,大于斜向值1

对于Gy下边的值 减去 上边的值.
权重: 在垂直方向,靠近中心点(目标像素点)的权重为2,大于斜向值1


img= cv2.imread('imgs/300.png',0)
cv2.imshow('1',img)
img2 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.CV_64F:计算结果不会被截断,取计算后的值(可能<0,可能大于255)。如果cv2.CV_64F替换为 -1 ,每个像素计算结果小于0取0,大于0取255
1,0:x 方向
0,1:y 方向
ksize:核大小

img3 = cv2.convertScaleAbs(img2)
convertScaleAbs:将越界的值限制再0-255,且取绝对值

x方向求出来 = Gx
y方向求出来 = Gy
1:1权重拼接:img = cv2.addWeighted(imgX,0.5,imgY,0.5,全局亮度)

Scharr算子

\[Gx = \begin{bmatrix} {{-3}}&{{0}}&{{3}}\\ {{10}}&{{0}}&{{10}}\\ {{-3}}&{{0}}&{{3}}\\ \end{bmatrix}\]

\[Gy = \begin{bmatrix} {{-3}}&{{-10}}&{{-3}}\\ {{0}}&{{0}}&{{0}}\\ {{3}}&{{10}}&{{3}}\\ \end{bmatrix}\]

原理上:和Sobel算子没有区别,差异在于比例放大了,也就是说,同样的差异,Scharr算子认为差异更大---更加敏感,放大细节

Laplacian算子

\[G = \begin{bmatrix} {{0}}&{{1}}&{{0}}\\ {{1}}&{{-4}}&{{1}}\\ {{0}}&{{1}}&{{0}}\\ \end{bmatrix}\]

通过结构可知:Laplaceian算子强调像素点和它上下左右四个像素点自和进行比较,有什么应用场景呢?还不知道

具体算法

(x,y单方向)
1.非边缘像素:对应位置,数值权重 再求和
2.边缘点
2.1 x方向:第一竖一定是0,设为基础点。其余边缘点 = 2
(右-左)
2.2 y方向:第一行一定是0,设为基础点。其余边缘点 = 2*(下-上)
(x,y斜向):(左上+右下)-(右上+左下)

posted @ 2021-01-07 15:33  m4kemoretime  阅读(100)  评论(0)    收藏  举报
页脚 HTML 代码