OpenCV--图像梯度
原图:形态学梯度:形态学其他操作见:图像膨胀、腐蚀、开运算、闭运算---python.opencv_独憩的博客-CSDN博客gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)cv.morphologyEx()是一个实现形态学操作的函数,可以实现开,闭,顶帽等,kernel为定义的核。拉普拉斯算子:拉普拉斯计算式,其实本质上是计算图像
·
原图:

形态学梯度:
形态学其他操作见:
图像膨胀、腐蚀、开运算、闭运算---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()

更多推荐



所有评论(0)