python实现图像边缘检测

本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下

任务描述

背景

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

基于卷积运算可实现边缘检测,对图像 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 ) -> 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)

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

(0)

相关推荐

  • 详解Python中图像边缘检测算法的实现

    目录 写在前面 1.一阶微分算子 1.1 Prewitt算子 1.2 Sobel算子 2.二阶微分算子 2.1 Laplace算子 2.2 LoG算子 3.Canny边缘检测 写在前面 从本节开始,计算机视觉教程进入第三章节——图像特征提取.在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用.本文讲解基础特征之一——图像边缘. 本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,

  • python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

  • Python+OpenCV 图像边缘检测四种实现方法

    目录 1.Sobel算子 2.Schaar算子(更能体现细节) 3.Laplacian算子(基于零穿越的,二阶导数的0值点) 4.Canny边缘检测(被认为是最优的边缘检测算法) 总结 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = [

  • python实现图像边缘检测

    本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下 任务描述 背景 边缘检测是数字图像处理领域的一个常用技术,被广泛应用于图像特征提取.目标识别.计算机视觉等领域.边缘可以理解为像素值发生跃迁的地方,而边缘检测就是要找到这样的地方.如下图所示,对左图进行边缘检测,结果为右图. 基于卷积运算可实现边缘检测,对图像 1(设分辨率为 w×h)进行边缘检测的方法如下: 1)将图像 1 转换成灰度图,仍称为图像 1:2)新建图像 2,图像 2 为灰度图,分辨率与图像 1

  • python进行图像边缘检测的详细教程

    目录 边缘检测 边缘检测算子 1.Roberts算子 2.Prewitt算子 3.Sobel算子 4.Canny算子 5.拉普拉斯算子 效果实验 1. Roberts边缘检测 2.Prewitt 边缘检测 3.Sobel边缘检测 4.Canny边缘检测 5.Laplacian 边缘检测 总结 边缘检测 图像边缘是指图像中表达物体的周围像素灰度发生阶跃变化的那些像素集合. 图像中两个灰度不同的相邻区域的交界处,必然存在灰度的快速过渡或称为跳变,它们与图像中各区域边缘的位置相对应,边缘蕴含了丰富的内

  • Python利用OpenCV和skimage实现图像边缘检测

    目录 一.简介 二.opencv 实践 三.skimage 实践 一.简介 提取图片的边缘信息是底层数字图像处理的基本任务之一.边缘信息对进一步提取高层语义信息有很大的影响.大部分边缘检测算法都是上个世纪的了,OpenCV 的使用的算法是 Canny 边缘检测算法,大概是在 1986 年由 John F. Canny 提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期.跟人眼系统相比,边缘检测算法仍然逊色不少. Canny 边缘检测算法是比较出色的算法,也是一种多步算法,可用于检测任何输入图像的

  • Python如何使用cv2.canny进行图像边缘检测

    目录 使用cv2.canny进行图像边缘检测 阈值对检测结果的影响 sobel算子对检测结果的影响 范数对检测结果的影响 总结 使用cv2.canny进行图像边缘检测 CV2提供了提取图像边缘的函数canny. 其算法思想如下: 1.使用高斯模糊,去除噪音点(cv2.GaussianBlur) 2.灰度转换(cv2.cvtColor) 3.使用sobel算子,计算出每个点的梯度大小和梯度方向 4.使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应 5.应用双阈值,来确定真实和潜在的边

  • python实现canny边缘检测

    canny边缘检测原理 canny边缘检测共有5部分组成,下边我会分别来介绍. 1 高斯模糊(略) 2 计算梯度幅值和方向. 可选用的模板:soble算子.Prewitt算子.Roberts模板等等; 一般采用soble算子,OpenCV也是如此,利用soble水平和垂直算子与输入图像卷积计算dx.dy: 进一步可以得到图像梯度的幅值: 为了简化计算,幅值也可以作如下近似: 角度为: 如下图表示了中心点的梯度向量.方位角以及边缘方向(任一点的边缘与梯度向量正交) : θ = θm = arcta

  • Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    学在前面 上篇 OpenCV 博客原计划完成一个 识别银行卡号的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习.完不成,就实现其它学习项目. 轮廓识别实战 先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记. 图片基本处理 import cv2 as cv src = cv.imread("./demo.jpg") gray = cv.cvtColor(src,

  • Python OpenCV实现边缘检测

    本文实例为大家分享了Python OpenCV实现边缘检测的具体代码,供大家参考,具体内容如下 1. Sobel 算子检测 Sobel 算子是高斯平滑和微分运算的组合,抗噪能力很强,用途也很多,尤其是效率要求高但对细纹理不是很在意的时候. 对于不连续的函数,有: 假设要处理的图像为I,在两个方向求导. 水平变化:用奇数大小的模板对图像I卷积,结果为Gx.例如,当模板大小为3时,Gx为: 垂直变化:用奇数大小的模板对图像I卷积,结果为Gy.例如,当模板大小为3时,Gy为: 在图像的每个点,结合以上

  • python OpenCV图像金字塔

    目录 1.图像金字塔理论基础 2.向下取样函数及使用 3.向上取样函数及使用 4.采样可逆性研究 5.拉普拉斯金字塔 6.图像轮廓介绍 轮廓近似 1.图像金字塔理论基础 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样.我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低.那我们为什么要做图像金字塔呢?这

随机推荐