边缘检测之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)
- 实现结果
Sobel算子效果
个人觉得在这个例子中平方和效果比较好
至于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算子效果图:
推荐阅读
-
C#图像处理之边缘检测(Sobel)的方法
-
OpenCV图像处理教程C++(十五)边缘检测算法--sobel算子、拉普拉斯算子、Canny算子
-
【OpenCV】边缘检测:Sobel、拉普拉斯算子
-
python—opencv图像膨胀|图像腐蚀|图像边缘检测sobel算子/拉普拉斯算子/canny算子
-
Opencv图像处理——边缘处理Sobel、拉普拉斯算子
-
【OpenCV3经典编程100例】(08)边缘检测:拉普拉斯算子Laplacian()
-
opencv使用sobel算子提取图像的边缘信息
-
边缘检测(2)Roberts算子
-
基本边缘检测算子—Roberts
-
Unity之梯度应用实现Roberts、Prewitt、Sobel边缘检测