Python实现基于卷积运算的图像边缘检测
本文介绍利用Python进行图像边缘检测的具体实现方法。通过将图像转换为灰度图,利用3x3卷积核计算像素点的卷积值,并根据结果设定黑白像素值来生成边缘图像。文中详细解析了卷积计算逻辑,并提供了完整的Python代码示例,包括卷积函数和边缘检测函数的实现细节,适用于计算机视觉入门学习。
本文分享使用Python实现图像边缘检测的完整代码示例,供读者参考学习。
任务描述
背景
边缘检测是数字图像处理中的核心技术之一,广泛应用于图像特征提取、目标识别及计算机视觉等领域。所谓边缘,即像素值发生显著跃迁的区域,边缘检测旨在定位这些区域。如图所示,对左侧原始图像进行边缘检测后,可得到右侧所示的边缘结果图。

基于卷积运算可以实现边缘检测。针对分辨率为 w×h 的图像1,执行边缘检测的具体步骤如下:
1)将原始图像1转换为灰度图像,仍记为图像1; 2)创建新的图像2,其格式为灰度图,分辨率与图像1保持一致; 3)遍历图像1中坐标为 (x,y) 的像素 p,计算其卷积值 c。若 c > 0,则将图像2中对应位置 (x,y) 的像素值设为 0(黑色);否则设为 255(白色)。注意,坐标范围限定为 1≤x≤w−2 且 1≤y≤h−2; 4)保存图像2,该图像即为最终的边缘检测结果。
上述第 3 步中,计算像素 p 处卷积 c 的具体方法如下:

1)选定一个卷积核,本例采用如左图所示的 3×3 矩阵; 2)选取以像素 p 为中心的 3×3 图像区域,如右图所示。图中每个小方格代表一个像素,数字表示其颜色值,像素 p 的坐标为 (x,y),所选区域对应图中的黄色底纹部分; 3)将步骤1中的 3×3 卷积核与步骤2中选定的 3×3 图像区域对应位置的元素相乘,并将所有乘积求和,得到像素 p 的卷积 c。例如,图中像素 p 的卷积计算过程为:
c=1×11+1×12+1×13+1×14−8×15+1×101+1×16+1×102+1×103=252
任务
本关要求补全程序代码,使其能够执行边缘检测功能。本关程序结构与上一关类似,可参考前关内容。
相关知识
略。
编程要求
请在 Begin-End 区间内补全代码,具体要求参见上文说明。
测试说明
测试集的正确输出结果如下:
(1 , 1 ) -> 0 (34 , 27) -> -537 (117, 78) -> -576 (242, 97) -> 528 (276, 61) -> 0
你的图像与正确答案相同!
说明如下:
1)系统会调用你编写的 convolute 函数,并以“像素坐标 -> 卷积”的格式打印结果。例如测试集第 1 行的 (1 , 1 ) -> 0 表示坐标 (1,1) 处像素的卷积值为 0; 2)此外,系统会检查程序生成的图像文件,若生成正确,则在测试集最后一行打印“你的图像与正确答案相同!”以确认结果。
开始你的任务吧,祝你成功!
from PIL import Image
# 求图像img中(x,y)处像素的卷积c
def convolute(img, x, y):
########## Begin ##########
juanjihe = [1,1,1,1,-8,1,1,1,1]
L = []
xl = [x - 1, x, x + 1]
yl = [y - 1, y, y + 1]
for j in yl:
for i in xl:
gray = img.getpixel((i, j)) # 取出灰度值
L.append(gray)
c = 0
for i,j in zip(juanjihe,L):
c = c + i*j
########## End ##########
return c
# 对图像文件1进行边缘检测,并将结果保存为图像文件2
# 图像文件1和2的路径分别为path1和path2
def detectEdge(path1, path2):
img1 = Image.open(path1) # 图像1
img1 = img1.convert('L') # 将图像1转换为灰度图
w, h = img1.size
img2 = Image.new('L', (w, h), 'white') # 图像2
########## Begin ##########
##此部分功能:依次求img1中每个像素的卷积c,再将c放到img2的对应位置
for x in range(1, w - 1):
for y in range(1, h - 1):
c = convolute(img1, x, y) # 计算卷积c
if c>0:
s=0
else:
s=255
img2.putpixel((x, y), s) # 再将c放到img2的对应位置
########## End ##########
img2.save(path2)
path1 = 'step5.bmp' # 原始图像
path2 = 'step5_2.bmp' # 检测到的边缘图像
detectEdge(path1, path2)以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









