图像梯度处理
文章目录
- 图像梯度处理
- 一、图像梯度-Sobel算子
- 二、图像梯度-Scharr算子
- 三、图像梯度-laplacian算子
- 四、常用函数
计算梯度:
相当于划一竖线,计算该线左右两边的像素值的差
一、图像梯度-Sobel算子
Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,即水平、竖直方向的梯度
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')
白到黑是正数,黑到白就是复数了,所有的负数会被截断成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')
一般求出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')
# 也可以直接计算,但直接计算效果不好
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy ,'sobelxy')
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')
二、图像梯度-Scharr算子
线条更加明显,能捕捉到更丰富的梯度信息
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算子
拉普拉斯算子对噪音点较为敏感,但很多噪音点并不是边界,一般不单独使用
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')
四、常用函数
- 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(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。
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定义的数据类型