图像梯度处理


文章目录

  • 图像梯度处理
  • 一、图像梯度-Sobel算子
  • 二、图像梯度-Scharr算子
  • 三、图像梯度-laplacian算子
  • 四、常用函数



计算梯度:


相当于划一竖线,计算该线左右两边的像素值的差

一、图像梯度-Sobel算子

opencv 求图像相减 opencv求图像梯度_opencv


Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,即水平、竖直方向的梯度

opencv 求图像相减 opencv求图像梯度_opencv_02

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline  #专有魔法指令,即时显示
def cv_show(name,img):
	cv2.imshow(name,img)
	cv2.waitKey(0)
	cv2.destoryAllWindows()
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

cv_show(sobelx,'sobelx')

opencv 求图像相减 opencv求图像梯度_python_03


白到黑是正数,黑到白就是复数了,所有的负数会被截断成0,所以要取绝对值

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobelx)
cv_show(sobely, 'sobelx')

opencv 求图像相减 opencv求图像梯度_计算机视觉_04


opencv 求图像相减 opencv求图像梯度_opencv_05


一般求出Gx和Gy后还要求一个总和G,G=根号下 (Gx²+Gy²)或 G=|Gx|+|Gy|

# 分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 0.5x + 0.5y + 0
cv_show(sobelxy ,'sobelxy')

opencv 求图像相减 opencv求图像梯度_opencv 求图像相减_06

# 也可以直接计算,但直接计算效果不好
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy ,'sobelxy')

opencv 求图像相减 opencv求图像梯度_python_07

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

opencv 求图像相减 opencv求图像梯度_opencv 求图像相减_08


opencv 求图像相减 opencv求图像梯度_计算机视觉_09

二、图像梯度-Scharr算子

线条更加明显,能捕捉到更丰富的梯度信息

opencv 求图像相减 opencv求图像梯度_计算机视觉_10

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

三、图像梯度-laplacian算子

opencv 求图像相减 opencv求图像梯度_python_11


拉普拉斯算子对噪音点较为敏感,但很多噪音点并不是边界,一般不单独使用

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy, scharrxy, laplacian))
cv_show(res, 'res')

opencv 求图像相减 opencv求图像梯度_ci_12

四、常用函数

  • cv2.Sobel(img, ddepth, dx, dy,ksize)
Sobel算子
 img:当前的图像;ddepth:图像的深度(一般为-1,表示输入的深度和输出的深度是一样的);dx和dy分别表示水平和竖直方向;ksize:Soble算子的大小
  • cv2.Scharr(img, ddepth, dx, dy)
Scharr算子(能捕捉到更多的细节)
  • cv2.Laplacian(img, ddepth)
Laplacian算子(噪点影响很大)
 Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。

opencv 求图像相减 opencv求图像梯度_计算机视觉_13

dst=cv2.Laplacian(src,ddepth[,ksize[,scale[,delta[,borderType]]]])

    式中:

    ● dst代表目标图像。

    ● src代表原始图像。

    ● ddepth代表目标图像的深度。

    ● ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。当ksize的值为1时,Laplacian算子计算时采用的 3×3的核如上所示。

    ● scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为 1,表示不进行缩放。

    ● delta代表加到目标图像上的可选值,默认为0。

    ● borderType代表边界样式。
  • cv2.convertScaleAbs(sobelx)
变为绝对值

CV_8U - 8位无符号整数(0…255)

CV_8UC3 C后面是通道数

CV_8S - 8位有符号整数(-128…127)

CV_16U - 16位无符号整数(0…65535)

CV_16S - 16位有符号整数(-32768…32767)

CV_32S - 32位有符号整数(-2147483648…2147483647)

CV_32F - 32位浮点数(-FLT_MAX…FLT_MAX,INF,NAN)

CV_64F - 64位浮点数(-DBL_MAX…DBL_MAX,INF,NAN)

cv2.CV_64F代表每一个像素点元素占64位浮点数,是opencv定义的数据类型