opencv笔记(4)——图像梯度处理

图像梯度处理

文章目录

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

一、图像梯度-Sobel算子

opencv笔记(4)——图像梯度处理_第1张图片
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()
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')

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

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

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

二、图像梯度-Scharr算子

opencv笔记(4)——图像梯度处理_第2张图片

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笔记(4)——图像梯度处理_第3张图片
拉普拉斯算子对噪声较为敏感

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笔记(4)——图像梯度处理_第4张图片

四、常用函数

  • 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算子(噪点影响很大)
    
  • cv2.convertScaleAbs(sobelx)

     变为绝对值
    

你可能感兴趣的:(OpenCV,opencv,边缘检测,计算机视觉,cv,深度学习)