OpenCV--图像梯度

OpenCV--图像梯度,第1张

OpenCV--图像梯度 原图:

形态学梯度:

形态学其他 *** 作见:

图像膨胀、腐蚀、开运算、闭运算---python.opencv_独憩的博客-CSDN博客

gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

cv.morphologyEx()是一个实现形态学 *** 作的函数,可以实现开,闭,顶帽等,kernel为定义的核。

拉普拉斯算子

拉普拉斯计算式,其实本质上是计算图像附近区域的导数:

laplacian = cv.Laplacian(img,cv.CV_8UC1)

第二个参数代表输出图像的类型。

import cv2.cv2
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv2.imread(r'XXXX.jpg')
img = cv2.resize(img, (0, 0), fx=0.1, fy=0.1, interpolation=cv2.INTER_NEAREST)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


kernel =cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
laplacian = cv.Laplacian(img,cv.CV_8UC1)
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

plt.subplot(1,2,1),plt.imshow(gradient,cmap = 'gray')
plt.title('morphology'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])

plt.show()

sobel算子:

分为x,y两个方向:

  

Scharr算子:

 

对于原图像:

sobel算子:

import cv2.cv2
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv2.imread(r'chess.jpg')
#img = cv2.resize(img, (0, 0), fx=0.1, fy=0.1, interpolation=cv2.INTER_NEAREST)

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sobelx = cv.Sobel(img,cv.CV_8UC1,1,0)
sobely = cv.Sobel(img,cv.CV_8UC1,0,1)
plt.subplot(1,2,1),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

Scharr算子:

import cv2.cv2
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv2.imread(r'chess.jpg')
#img = cv2.resize(img, (0, 0), fx=0.1, fy=0.1, interpolation=cv2.INTER_NEAREST)

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sobelx = cv.Scharr(img,cv.CV_8UC1,1,0)
sobely = cv.Scharr(img,cv.CV_8UC1,0,1)
plt.subplot(1,2,1),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

 可以看出,Scharr算子效果更好。

我们还可以将两个方向的梯度合起来,得到边缘:

import cv2.cv2
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv2.imread(r'chess.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

rows = img.shape[0]
cols = img.shape[1]


sobelx = cv.Sobel(img,cv.CV_8UC1,1,0)
sobelx=cv2.convertScaleAbs(sobelx)
sobely = cv.Sobel(img,cv.CV_8UC1,0,1)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

Scharrx = cv.Scharr(img,cv.CV_8UC1,1,0)
Scharrx=cv2.convertScaleAbs(Scharrx)
Scharry = cv.Sobel(img,cv.CV_8UC1,0,1)
Scharry=cv2.convertScaleAbs(Scharry)
Scharrxy=cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0)


plt.subplot(1,2,1),plt.imshow(sobelxy,cmap = 'gray')
plt.title('sobel xy'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2),plt.imshow(Scharrxy,cmap = 'gray')
plt.title('Scharr xy'), plt.xticks([]), plt.yticks([])
plt.show()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5594867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存