原图:

形态学梯度:

形态学其他操作见:

图像膨胀、腐蚀、开运算、闭运算---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两个方向:

 G_x=\begin{bmatrix} -1 & 0 &1 \\ -2& 0& 2\\ -1& 0& 1 \end{bmatrix} G_y=\begin{bmatrix} -1 & -2 &-1 \\ 0& 0& 0\\ -1&-2& -1 \end{bmatrix}

Scharr算子:

G_x=\begin{bmatrix} -3 & 0 &3 \\ -10& 0& 10\\ -3& 0& 3 \end{bmatrix} G_y=\begin{bmatrix} -3 & -10 &-3 \\ 0& 0& 0\\ -3&-10& -3 \end{bmatrix}

对于原图像:

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()

Logo

GitCode AI社区是一款由 GitCode 团队打造的智能助手,AI大模型社区、提供国内外头部大模型及数据集服务。

更多推荐