Python实现基于卷积运算的图像边缘检测

拾光
拾光
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍利用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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表