python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)
这次实验,我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测,然后后面又使用了Canny算法进行边缘检测。
直接看代码,代码比较简单,不是很复杂:
注:cv2.convertScaleAbs进行了一个绝对值操作,因为可能计算出来梯度为负值。
from ctypes.wintypes import SIZE
from multiprocessing.pool import IMapUnorderedIterator
import cv2
import copy
import math
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import ospath=r'ls.jpg'img=cv2.imread(path,1)
img_gray=cv2.imread(path,0)def cv_show(name,img):cv2.imshow(name,img)#cv2.waitKey(0),接收0,表示窗口暂停cv2.waitKey(0)#销毁所有窗口cv2.destroyAllWindows()#cv_show('img_gray',img_gray)#Sobel算子img_sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#1,0 表示选择水平还是竖直放心计算梯度img_sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#1,0 表示选择水平还是竖直放心计算梯度sobel_img_x_abs=cv2.convertScaleAbs(img_sobel_x)
img_sobel_y_abs=cv2.convertScaleAbs(img_sobel_y)img_sobel_xy_abs=cv2.addWeighted(sobel_img_x_abs,0.5,img_sobel_y_abs,0.5,0)
plt.subplot(231)
#img_gray=BGR_TO_RGB(img_gray,'gray')
plt.imshow(img_sobel_x[:,:,::-1])
plt.title('img_sobel_x')plt.subplot(232)
plt.imshow(sobel_img_x_abs[:,:,::-1])
plt.title('sobel_img_x_abs')
plt.subplot(233)#result=BGR_TO_RGB(result)
plt.imshow( img[:,:,::-1])
plt.title('img')plt.subplot(234)#result=BGR_TO_RGB(result)
plt.imshow( img_sobel_y[:,:,::-1])
plt.title('img_sobel_y')plt.subplot(235)#result=BGR_TO_RGB(result)
plt.imshow( img_sobel_y_abs[:,:,::-1])
plt.title('img_sobel_y_abs')plt.subplot(236)#result=BGR_TO_RGB(result)
plt.imshow( img_sobel_xy_abs[:,:,::-1])
plt.title('img_sobel_xy_abs')
plt.show()#沙尔算子scharrx=cv2.Scharr(img,cv2.CV_64F,dx=1,dy=0)scharry=cv2.Scharr(img,cv2.CV_64F,dx=0,dy=1)scharry_img_x_abs=cv2.convertScaleAbs(scharrx)scharry_img_y_abs=cv2.convertScaleAbs(scharry)img_scharry_xy_abs=cv2.addWeighted(scharry_img_x_abs,0.5,scharry_img_y_abs,0.5,0)
#拉普拉斯算子
lap_img=cv2.Laplacian(img,cv2.CV_64F)
lap_img_abs=cv2.convertScaleAbs(lap_img)
plt.subplot(121)
#img_gray=BGR_TO_RGB(img_gray,'gray')
plt.imshow(scharry_img_y_abs[:,:,::-1])
plt.title('scharry_img_y_abs')plt.subplot(122)
plt.imshow(lap_img_abs[:,:,::-1])
plt.title('lap_img_abs')
plt.show()#result=BGR_TO_RGB(rpath=r'D:\learn\photo\cv\lena.jpg'img=cv2.imread(path,0)
img_canny1=cv2.Canny(img,80,150)
img_canny2=cv2.Canny(img,50,150)
plt.subplot(131)
#img_gray=BGR_TO_RGB(img_gray,'gray')
plt.imshow(img,'gray')
plt.title('img')
plt.subplot(132)
#img_gray=BGR_TO_RGB(img_gray,'gray')
plt.imshow(img_canny1,'gray')
plt.title('img_canny1')plt.subplot(133)
plt.imshow(img_canny2,'gray')
plt.title('img_canny2')
plt.show()os.system("pause")