import numpy as np
#用于处理图像矩阵、算子矩阵及相关运算
from PIL import Image
#图像处理模块
import matplotlib.pyplot as plt
import matplotlib.cm as cm
'''
定义函数img_conv (image_array,operator)用于图像卷积计算
其中,参数image_array为原图的灰度图像矩阵,operator为算子
返回结果为原图的灰度图像与算子卷积后的结果矩阵
实际上,SciPy库中的signal模块含有一个二维卷积函数convolve2d()
'''
def img_conv (image_array,operator):
# 原图像矩阵的深拷贝
image=image_array.copy()
dim1,dim2=image.shape
# 将矩阵中的每个元素与算子矩阵中的对应元素相乘再求和(忽略最外圈边框像素)
for i in range(1,dim1-1):
for j in range(1,dim2-1):
image[i,j]=(image_array[(i-1):(i+2),(j-1):(j+2)]*operator).sum()
# 由于卷积后各元素的值不一定为0~255,需归一化为0~255
image=image*(255.0/image.max())
#返回结果矩阵
return image
#定义x方向的Prewitt算子
operator_x=np.array([[-1,0,1],[-1,0,1],[-1,0,1]])
#定义y方向的Prewitt算子
operator_y=np.array([[-1,-1,-1],[0,0,0],[1,1,1]])
#打开原图并将其转化成灰度图像
image=Image.open("C:/Users/xpp/Desktop/Lena.png").convert("L")
# 转化成图像矩阵
image_array=np.array(image)
# 得到x方向导数矩阵
image_x=img_conv(image_array,operator_x)
# 得到y方向导数矩阵
image_y=img_conv(image_array,operator_y)
# 得到梯度矩阵
image_xy=np.sqrt(image_x**2+image_y**2)
# 将梯度矩阵各元素的值归一化为0~255
image_xy=(255.0/image_xy.max())*image_xy
'''
输出图像边缘检测结果。
其中,参数为image_array时输出为原图的灰度图像,
参数为image_x时输出为原图的x方向导数图像,
参数为image_y时输出为原图的y方向导数图像,
参数为image_xy时输出为原图的梯度图像
'''
plt.subplot(2,2,1)
plt.imshow(image_array,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(2,2,2)
plt.imshow(image_x,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(2,2,3)
plt.imshow(image_y,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(2,2,4)
plt.imshow(image_xy,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
算法:基于Prewitt算子的图像边缘检测是利用两个方向模板与图像进行邻域卷积(Adjacent Convolution)运算来完成图像边缘检测。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!