如何识别图像边缘?

作者: 阮一峰

日期: 2016年7月22日

图像识别(image recognition)是现在的热门技术。

文字识别、车牌识别、人脸识别都是它的应用。但是,这些都算初级应用,现在的技术已经发展到了这样一种地步:计算机可以识别出,这是一张狗的照片,那是一张猫的照片。

这是怎么做到的?

让我们从人眼说起,学者发现,人的视觉细胞对物体的边缘特别敏感。也就是说,我们先看到物体的轮廓,然后才判断这到底是什么东西。

计算机科学家受到启发,第一步也是先识别图像的边缘。

加州大学的学生 Adit Deshpande 写了一篇文章《A Beginner's Guide To Understanding Convolutional Neural Networks》,介绍了一种最简单的算法,非常具有启发性,体现了图像识别的基本思路。

首先,我们要明白,人看到的是图像,计算机看到的是一个数字矩阵。所谓"图像识别",就是从一大堆数字中找出规律。

怎样将图像转为数字呢?一般来说,为了过滤掉干扰信息,可以把图像缩小(比如缩小到 49 x 49 像素),并且把每个像素点的色彩信息转为灰度值,这样就得到了一个 49 x 49 的矩阵。

然后,从左上角开始,依次取出一个小区块,进行计算。

上图是取出一个 5 x 5 的区块。下面的计算以 7 x 7 的区块为例。

接着,需要有一些现成的边缘模式,比如垂直、直角、圆、锐角等等。

上图右边是一个圆角模式,左边是它对应的 7 x 7 灰度矩阵。可以看到,圆角所在的边缘灰度值比较高,其他地方都是0。

现在,就可以进行边缘识别了。下面是一张卡通老鼠的图片。

取出左上角的区块。

取样矩阵与模式矩阵对应位置的值相乘,进行累加,得到6600。这个值相当大,它说明什么呢?

取样矩阵移到老鼠头部,与模式矩阵相乘,得到的值是0。

乘积越大就说明越匹配,可以断定区块里的图像形状是圆角。通常会预置几十种模式,每个区块计算出最匹配的模式,然后再对整张图进行判断。

(完)

留言(33条)

其实,从边缘出发,还有其他启发性的东西。边缘是变化很明显的分界点,人的眼睛的确对这个很敏感。但边缘只剩下一条线了。那么很容易想到,如果不是一条线,该用什么呢?答案是梯度。在边缘处,考查变化的强弱及方向。这是现在一些常见的图像识别算法的基础,比如 hog,sift。 都是基于梯度的。

ps:记得是四五年前上本科,读过作者的博客。那天偶然在 Twitter 上看到,就又来了。不得不佩服作者,坚持了这么多年,也给我们带来了这么多好的教程。感谢。

我靠,我大学论文就是看的这个

虽然技术知识不太懂,但是早起写blog的精神,同样值得学习~

一般用的方法是canny,首先用sobel做一下x和y方向的梯度图,用 (x^2+y^2) 作为合成梯度,然后再用上下界卡一个阈值,灌水求出连续线段就是canny边缘检测啦 :)

从配图和标题看,那篇文章讲的”边缘模式“可能不是预设的,而是从数据里学习到的。

阮先生以前发过图像识别的博文,感兴趣的可以在这个博客里找找。

wow,没想到是通过矩阵相乘来判定相似度,nice。

卷积神经网络,局部感知,共享权重,池化

这个马赛克。。。。

不知道ruan能写到什么时候,我。。。

我是一名计算机的本科生,这个学期刚好学习了一点有关数字图像的内容,但是感觉很多东西都只是泛泛而谈,老师会让我们在对图像的基础知识一点都没有的情况下去自学opencv,导致一些关键的术语都弄不清,感觉自己虽然课后也是会下点功夫自学的,但是感觉一学期下来收获也不大,挺迷茫的,今天刚好看到这篇博文,随便抒发一下

# 会一直关注

这个牛,搞清楚了图像识别的原理,以前一直不知道是怎么回事。

打算从事数据方面的工作,对这方面有了大概的认知,会不会有一天,可以识别生活中的所有东西,那样子能不能改变世界??

边缘提取.

引用西瓜的发言:

我是一名计算机的本科生,这个学期刚好学习了一点有关数字图像的内容,但是感觉很多东西都只是泛泛而谈,老师会让我们在对图像的基础知识一点都没有的情况下去自学opencv,导致一些关键的术语都弄不清,感觉自己虽然课后也是会下点功夫自学的,但是感觉一学期下来收获也不大,挺迷茫的,今天刚好看到这篇博文,随便抒发一下

在CSDN上有一个比较详细的关于OpenCV的教程。http://blog.csdn.net/column/details/opencv-tutorial.html,每一篇都会首先讲解图像处理的一些改变,然后用OpenCV来实现,非常通俗易懂,而且有很多配图。
我现在工作主要是医学图像处理,会涉及到图像分割和图像配准。边缘提取也属于图像分割的一个分支。

学过数字图像却没学明白的路过

今天学习到新的知识了。识别图像,牛!

您好.我想问问,如果要将一幅图片和多个边缘模式(比如 5 个)的相似度大小进行比较,是否只需比较 5 次矩阵乘法累加后的结果大小?如果是的话,这种算法的依据是什么?(或者说,"矩阵乘法后再累加"得出的这个数的数学意义是什么?)

没看懂,以后要是有这方面的需求,再回来细看,谢谢阮老师的分享

多谢阮老师解决了我困惑多时的问题~Orz

很简单的就把方法说出来了,很受用。

文章介绍的预设应该只是边缘识别的一种吧,不过还是长见识了。。。

引用intijk的发言:

一般用的方法是canny,首先用sobel做一下x和y方向的梯度图,用 (x^2+y^2) 作为合成梯度,然后再用上下界卡一个阈值,灌水求出连续线段就是canny边缘检测啦 :)

正解,这种问题也用CNN解决太浪费处理器了吧?现在的程序员都是被GPU惯坏了。

根据两幅图应该是
Multiplication and Summation =(50*30)+(50*30)+(50*30)+(50*30) 才对吧?

一直关注阮老师的博客,不得不佩服您一直坚持下去的毅力!
克服惰性,拒绝拖延,提升执行力。

佩服阮老师的坚持,非常感谢!

sobel 言简意赅

图片转化为矩阵后,Qr分解后取较大的部分合成就是边缘了

两个7*7的矩阵相乘的结果不是还是一个7*7的矩阵吗,这个值是怎么来的

相乘是很好的用法

引用d的发言:

两个7*7的矩阵相乘的结果不是还是一个7*7的矩阵吗,这个值是怎么来的

它不是用了矩阵的相乘,只是将它们的一一对应位置上的数进行相乘,然后相加得到的结果

现在是2024年,
这个问题可以用卷积神经网络解决了

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接