前言
在图像梯度和边缘提取的文章中,详细介绍了关于图像梯度和边缘提取的计算方法,这种计算方法依赖卷积运算,根据实际需要,设计不同的卷积kernel就可以实现不同方式的边缘提取。
实现图像边缘提取之前,首先需要对图片做一些预处理工作,这些预处理操作包括图像灰度化和图像阈值求取。其具体的代码如下所示:

- 图片灰度化处理
import cv2
img_gray = cv2.imread("2.jpg",cv2.IMREAD_GRAYSCALE)
(m,n) = img_gray.shape
shape = (m,n)
- 对图片进行阈值求取
利用OTSU算法原理,对图片进行的阈值进行求取,根据图像阈值处理算的代码,所求得阈值为46
实现图像的边缘提取
-
梯度法
设计如下图所示的kernel,则梯度算法的计算公式如下所示:
卷积kernel
梯度算子公式:
其代码如下所示:
T = 46
for i in range(1,m-1):
for j in range(1,n-1):
img_g[i,j]=np.abs(img_gray[i+1,j]-img_gray[i,j])+np.abs(img_gray[i,j+1]-img_gray[i,j])
if img_g[i,j]<T:
img_g[i,j]=0
else:
img_g[i,j]=255
实现效果如下所示:
- roberts 算子
卷积kernel的计算公式如下所示:
根据以上公式,roberts的实现代码如下所示:
T = 46
img_r = np.zeros(shape)
for i in range(1,m-1):
for j in range(1,n-1):
img_r[i,j]=np.abs(img_gray[i+1,j+1]-img_gray[i,j])+np.abs(img_gray[i,j+1]-img_gray[i+1,j])
if img_r[i,j]<T:
img_r[i,j]=0
else:
img_r[i,j]=255
- prewitt 算子
prewitt算子的卷积kernel公式如下所示:
根据以上公式,实现代码如下所示:
T=46
img_p = np.zeros(shape)
for i in range(1,m-1):
for j in range(1,n-1):
img_p[i,j]=np.abs(img_gray[i-1,j-1]+img_gray[i,j-1]+img_gray[i+1,j-1]-img_gray[i-1,j+1]-img_gray[i,j+1]-img_gray[i+1,j+1])+np.abs(img_gray[i+1,j-1]+img_gray[i+1,j]+img_gray[i+1,j+1]-img_gray[i-1,j-1]-img_gray[i-1,j]-img_gray[i-1,j+1])
if img_p[i,j]<T:
img_p[i,j] = 0
else:
img_p[i,j]=255
- sobel 算子
sobel算子卷积kernel公式如下所示:
其代码实现如下所示:
T=46
img_s = np.zeros(shape)
for i in range(1,m-1):
for j in range(1,n-2):
img_s[i,j]=np.abs(img_gray[i-1,j-1]+img_gray[i,j-1]+img_gray[i+1,j-1]-img_gray[i-1,j+1]-img_gray[i,j+1]-img_gray[i+1,j+1])+np.abs(img_gray[i+1,j-1]+img_gray[i+1,j]+img_gray[i+1,j+1]-img_gray[i-1,j-1]-img_gray[i-1,j]-img_gray[i-1,j+1])
if img_s[i,j]<T:
img_s[i,j] = 0
else:
img_s[i,j]=255
实现效果图如下所示:
网友评论