图像边缘检测

背景

  边缘检测是数字图像处理领域的一个常用技术,被广泛应用于图像特征提取、目标识别、计算机视觉等领域。边缘可以理解为像素值发生跃迁的地方,而边缘检测就是要找到这样的地方。如下图所示,对左图进行边缘检测,结果为右图。

  基于卷积运算可实现边缘检测,对图像 1(设分辨率为 w×h)进行边缘检测的方法如下:
  1)将图像 1 转换成灰度图,仍称为图像 1;
  2)新建图像 2,图像 2 为灰度图,分辨率与图像 1 相同;
  3)对于图像 1 中坐标为 (x,y) 的像素 p,求 p 的卷积 c,若 c>0,则将图像 2 中 (x,y) 处的像素值设置成 0(即黑色),否则设置成 255(即白色),其中,1≤x≤w−2、1≤y≤h−2;
  4)保存图像 2,图像 2即存放了检测结果。
  其中,第 3 步要计算 (x,y) 处像素 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 , 1 ) -> 0
  2. (34 , 27) -> -537
  3. (117, 78) -> -576
  4. (242, 97) -> 528
  5. (276, 61) -> 0
  6. 你的图像与正确答案相同!

  说明如下:
  1)系统会调用你编写的convolute函数,并以“像素坐标 -> 卷积”的格式打印结果,如测试集第 1 行的(1 , 1 ) -> 0表示:(1,1) 处像素的卷积为0;   2)此外,系统会检查程序生成的图像文件,若正确则在测试集最后一行打印你的图像与正确答案相同!


开始你的任务吧,祝你成功!

 

参考代码:

from PIL import Image

def convolute(img, x, y):

    ########## Begin ##########

    A=[]

    B=[1,1,1,1,-8,1,1,1,1]

    c=0

    for i in range(x-1,x+2):

        for j in range(y-1,y+2):

            a=img.getpixel((i,j))

            A.append(a)

    for i in range(9):

        s=A[i]*B[i]

        c+=s

########## End ##########

    return c

 

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 ##########

        for x in range(1,w-1):

                for y in range(1,h-1):

                    c=convolute(img1,x,y)

                    if c>0:

                        d=0

                    else:

                        d=255

                    img2.putpixel((x,y),d)

########## End ##########

    img2.save(path2)

path1 = 'src/step5/source/step5.bmp'  

path2 = 'src/step5/student/step5_2.bmp'

detectEdge(path1, path2)

自己写的话一定要创建一个新的灰度图,将原图计算的卷积填入新图。

新图创建参考:  图像置换加密

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值