python实现图像边缘检测
作者:名剑求瑕 发布时间:2022-03-17 15:35:11
本文实例为大家分享了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)
来源:https://blog.csdn.net/qq_42833469/article/details/121581713


猜你喜欢
- 本文实例讲述了python实现合并两个数组的方法。分享给大家供大家参考。具体如下:python合并两个数组,将两个数组连接成一个数组,例如,
- MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。MyISAM是My
- fmtGo语言用于控制文本输出常用的标准库是fmtfmt中主要用于输出的函数有:Print: 输出到控制台,不接受任何格式化操作Printl
- python-tkinter 实现各种个样的撩妹鼠标拖尾,效果图展示:系统的拖尾已经无法满足我们了,女朋友叫你把鼠标拖尾换成她的照片,让你时
- 简介黑洞图像大家都知道,毕竟前几年刚发布的时候曾火遍全网,甚至都做成表情包了。问题在于,凭什么认为这就是黑洞的照片,而不是一个甜甜圈啥的给整
- 引用自百度知道里面的一个问答例如数组{1,2,3,4,5}要把数组里面的3删除得到{1,2,4,5}js代码:<script type
- Js代码:/*** 验证码*/function yzm(){var codeChars = new Array(0, 1, 2, 3, 4,
- 作者:Rung András原文:How To Engage Customers In Your E-Commerce Website对于我
- 前言:有读者可能会一脸懵?啥是索引潜水?你给起的名字的吗?有没有索引蛙泳?这个名字还真不是我起的,今天要讲的知识点就叫索引潜水(Index
- Software as a service 软件即服务,21世纪开始兴起的一种完全创新的软件应用模式。客户通过互联网向厂商定购所需的应用软件
- PHP quotemeta() 函数实例在预定义的字符前添加反斜杠:<?php$str = "Hello world. (c
- mysql 误删除ibdata1之后如何恢复如果误删除了在线服务器中mysql innodb相关的数据文件ibdata1以及日志文件 ib_
- #!/usr/bin/env python# coding: utf-8### show time in console#import sy
- ADO也提供更有效率方法来取得数据。GetRows 方法传回一个二维的数组变量,每一行对应Recordset中的一笔记录,且每
- 超如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Pyth
- mysql在查询上千万级数据的时候,通过索引可以解决大部分查询优化问题。但是在处理上亿数据的时候,索引就不那么友好了。数据表(日志)是这样的
- 不多说,我们直接上源码:# -*- coding:UTF-8 -*-'''实现文件打包、上传与校验Created o
- 一个post类型的接口怎么编写脚本实现1、打开网页,在fiddler上获取到接口的URL2、用Python的requests库实现impor
- 背景本文主要给大家介绍了关于在Python一段程序中使用多次事件循环的相关内容,我们在Python异步程序编写中经常要用到如下的结构impo
- 前言:前面我们提到了Python数据类型中的内置数值类型与字符串类型。今天学习一下Python的序列数据类型,要知道的是在Python中没有