-
Sobel和 Prewitt算子思想
之所以把这个两个算子拿出来一起说,是因为Sobel算子可以看做是Prewitt的改进版本,向对于Prewitt算子,Sobel算子的模板使用的权值2,可以增加中心点的重要性,在某种程度上实现平滑效果。
Sobel(Prewiit算子亦是如此)边缘检测算子用两个3*3的模板来近似计算图像在某点(i,j)对x和y的偏导数Gx,Gy。而梯度幅值往往有三种表达式:
G = |Gx| + |Gy|
G = pow(Gx,2) + pow(Gy,2)
G = max(Gx,Gy)
这里我们三种情况都试一下。在计算完幅值后,设定一个合适的阈值T,G > T则 为255(认为该点是阈值点),否则为0. -
算法实现
import numpy as np
import cv2
from matplotlib import pyplot as plt
#定义掩膜
m1 = np.array([[-1,-2,-1],[0,0,0],[1,2,1]]) #Gx
m2 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]]) #Gy
img = cv2.imread("lena_1.tiff",0)
#边缘扩充
image = cv2.copyMakeBorder(img, 1, 1, 1, 1, borderType=cv2.BORDER_REPLICATE)
rows = image.shape[0]
cols = image.shape[1]
temp = list(range(2))
image1 = np.zeros(image.shape)
image2 = np.zeros(imag