OpenCV-Prewitt Operator

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

原图:
OpenCV-Prewitt Operator_第1张图片边缘检测:
OpenCV-Prewitt Operator_第2张图片

你可能感兴趣的:(OpenCV基础教程,卷积,边缘检测,cv,opencv,计算机视觉)