欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

边缘检测之Sobel算子&&Prewitt算子

程序员文章站 2022-07-14 11:02:17
...
  • 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(image.shape)
image3 = np.zeros(image.shape)
for i in range(1,rows-1):
    for j in range(1,cols-1):
        temp[0] = np.abs(
            (np.dot(np.array([1, 1, 1]), (m1 * image[i - 1:i + 2, j - 1:j + 2]))).dot(np.array([[1], [1], [1]])))
        temp[1] = np.abs(
            (np.dot(np.array([1, 1, 1]), (m2 * image[i - 1:i + 2, j - 1:j + 2]))).dot(np.array([[1], [1], [1]])))
        image1[i,j] = int(np.max(temp))#G = max(Gx,Gy)
        image2[i, j] = int(np.sqrt(  temp[0]**2 + temp[1]**2 ))#G = pow(Gx,2) + pow(Gy,2)
        image3[i, j] = int(np.sum(temp))#G = |Gx| + |Gy|
        if image1[i, j] > 128:
            image1[i, j] = 255
        else:
            image1[i, j] = 0

        if image2[i, j] > 128:
            image2[i, j] = 255
        else:
            image2[i, j] = 0

        if image3[i, j] > 128:
            image3[i, j] = 255
        else:
            image3[i, j] = 0

cv2.imshow("max",image1)  
cv2.imshow(("squart"),image2)
cv2.imshow(("sum"),image3)
cv2.waitKey(0)
  1. 实现结果
    Sobel算子效果
    边缘检测之Sobel算子&&Prewitt算子
    个人觉得在这个例子中平方和效果比较好
    至于Prewitt算子,改一下掩膜即可;
    即: m1 = np.array([[-1,-1,-1],[0,0,0],[1,1,1]]) #Gx
    m2 = np.array([[-1,0,1],[-1,0,1],[-1,0,1]]) #Gy
    Prewitt算子效果图:
    边缘检测之Sobel算子&&Prewitt算子