Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
Python:
import cv2 as cv
import numpy as np
from scipy import signal
def Prewitt_operator(image):
#垂直方向上均值平滑
prewitt_y=np.array([[1],[1],[1]],np.float32)
con_y=signal.convolve2d(image,prewitt_y,mode='same',boundary='symm')
#水平方向差分
prewitt_x=np.array([[1,0,-1]],np.float32)
prewitt1=signal.convolve2d(con_y,prewitt_x,mode='same',boundary='symm')
#水平方向上均值平滑
prewitt_x1 = np.array([[1, 1, 1]], np.float32)
con_y1 = signal.convolve2d(image, prewitt_x1, mode='same', boundary='symm')
#垂直方向差分
prewitt_y1 = np.array([[1], [0], [-1]], np.float32)
prewitt2= signal.convolve2d(con_y1, prewitt_y1, mode='same', boundary='symm')
return (prewitt1,prewitt2)
if __name__=="__main__":
img=cv.imread("D:/testimage/river.jpg")
gray_dst = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
prewitt1,prewitt2=Prewitt_operator(gray_dst)
#垂直平滑,水平差分
abs_prewitt1=np.abs(prewitt1)
edge_prewitt1=abs_prewitt1.copy()
edge_prewitt1[edge_prewitt1>255]=255
edge_prewitt1=edge_prewitt1.astype(np.uint8)
cv.imshow("result1",edge_prewitt1)
#水平平滑,垂直差分
abs_prewitt2=np.abs(prewitt2)
edge_prewitt2=abs_prewitt2.copy()
edge_prewitt2[edge_prewitt2>255]=255
edge_prewitt2=edge_prewitt2.astype(np.uint8)
cv.imshow("result2",edge_prewitt2)
edge=0.5*abs_prewitt1+0.5*abs_prewitt2
edge[edge>255]=255
edge=edge.astype(np.uint8)
cv.imshow("edge",edge)
cv.imwrite("D:/testimage/result-prewitt.jpg", edge)
cv.waitKey(0)
cv.destroyAllWindows()
原图:
边缘检测: