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