图像识别(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。
乘积越大就说明越匹配,可以断定区块里的图像形状是圆角。通常会预置几十种模式,每个区块计算出最匹配的模式,然后再对整张图进行判断。
(完)
yeifei 说:
其实,从边缘出发,还有其他启发性的东西。边缘是变化很明显的分界点,人的眼睛的确对这个很敏感。但边缘只剩下一条线了。那么很容易想到,如果不是一条线,该用什么呢?答案是梯度。在边缘处,考查变化的强弱及方向。这是现在一些常见的图像识别算法的基础,比如 hog,sift。 都是基于梯度的。
ps:记得是四五年前上本科,读过作者的博客。那天偶然在 Twitter 上看到,就又来了。不得不佩服作者,坚持了这么多年,也给我们带来了这么多好的教程。感谢。
2016年7月22日 08:37 | # | 引用
斯夫 说:
我靠,我大学论文就是看的这个
2016年7月22日 10:00 | # | 引用
Nancy 说:
虽然技术知识不太懂,但是早起写blog的精神,同样值得学习~
2016年7月22日 10:28 | # | 引用
intijk 说:
一般用的方法是canny,首先用sobel做一下x和y方向的梯度图,用 (x^2+y^2) 作为合成梯度,然后再用上下界卡一个阈值,灌水求出连续线段就是canny边缘检测啦 :)
2016年7月22日 12:58 | # | 引用
必填 说:
从配图和标题看,那篇文章讲的”边缘模式“可能不是预设的,而是从数据里学习到的。
2016年7月22日 13:30 | # | 引用
国家互联网主席 说:
阮先生以前发过图像识别的博文,感兴趣的可以在这个博客里找找。
2016年7月22日 13:42 | # | 引用
Jack 说:
wow,没想到是通过矩阵相乘来判定相似度,nice。
2016年7月22日 14:56 | # | 引用
Leo Sun 说:
卷积神经网络,局部感知,共享权重,池化
2016年7月22日 15:01 | # | 引用
xmqv 说:
这个马赛克。。。。
2016年7月22日 20:08 | # | 引用
wenhandi 说:
不知道ruan能写到什么时候,我。。。
2016年7月24日 22:44 | # | 引用
西瓜 说:
我是一名计算机的本科生,这个学期刚好学习了一点有关数字图像的内容,但是感觉很多东西都只是泛泛而谈,老师会让我们在对图像的基础知识一点都没有的情况下去自学opencv,导致一些关键的术语都弄不清,感觉自己虽然课后也是会下点功夫自学的,但是感觉一学期下来收获也不大,挺迷茫的,今天刚好看到这篇博文,随便抒发一下
2016年7月26日 19:38 | # | 引用
Steve 说:
# 会一直关注
2016年7月28日 09:47 | # | 引用
叶子 说:
这个牛,搞清楚了图像识别的原理,以前一直不知道是怎么回事。
2016年7月28日 18:20 | # | 引用
Smike 说:
打算从事数据方面的工作,对这方面有了大概的认知,会不会有一天,可以识别生活中的所有东西,那样子能不能改变世界??
2016年7月29日 11:08 | # | 引用
nanker 说:
边缘提取.
2016年7月29日 16:31 | # | 引用
蓬stephen蓬 说:
在CSDN上有一个比较详细的关于OpenCV的教程。http://blog.csdn.net/column/details/opencv-tutorial.html,每一篇都会首先讲解图像处理的一些改变,然后用OpenCV来实现,非常通俗易懂,而且有很多配图。
我现在工作主要是医学图像处理,会涉及到图像分割和图像配准。边缘提取也属于图像分割的一个分支。
2016年7月29日 18:35 | # | 引用
jackwang 说:
学过数字图像却没学明白的路过
2016年8月 2日 17:30 | # | 引用
Steven 说:
今天学习到新的知识了。识别图像,牛!
2016年8月 2日 22:10 | # | 引用
Nota 说:
您好.我想问问,如果要将一幅图片和多个边缘模式(比如 5 个)的相似度大小进行比较,是否只需比较 5 次矩阵乘法累加后的结果大小?如果是的话,这种算法的依据是什么?(或者说,"矩阵乘法后再累加"得出的这个数的数学意义是什么?)
2016年8月 5日 14:46 | # | 引用
-random 说:
2016年8月 8日 09:50 | # | 引用
Kevin 说:
多谢阮老师解决了我困惑多时的问题~Orz
2016年8月 9日 16:41 | # | 引用
海东 说:
很简单的就把方法说出来了,很受用。
2016年8月15日 10:36 | # | 引用
张中华 说:
文章介绍的预设应该只是边缘识别的一种吧,不过还是长见识了。。。
2016年9月12日 10:44 | # | 引用
Embedded 说:
正解,这种问题也用CNN解决太浪费处理器了吧?现在的程序员都是被GPU惯坏了。
2016年9月26日 05:47 | # | 引用
崔来希 说:
根据两幅图应该是
Multiplication and Summation =(50*30)+(50*30)+(50*30)+(50*30) 才对吧?
2017年1月 9日 10:05 | # | 引用
Acelit 说:
一直关注阮老师的博客,不得不佩服您一直坚持下去的毅力!
克服惰性,拒绝拖延,提升执行力。
2017年2月13日 23:45 | # | 引用
xiaomogu 说:
佩服阮老师的坚持,非常感谢!
2017年2月26日 23:30 | # | 引用
小学肄业 说:
sobel 言简意赅
2018年2月 1日 10:52 | # | 引用
兔斯基 说:
图片转化为矩阵后,Qr分解后取较大的部分合成就是边缘了
2018年11月13日 09:04 | # | 引用
d 说:
两个7*7的矩阵相乘的结果不是还是一个7*7的矩阵吗,这个值是怎么来的
2020年7月20日 00:29 | # | 引用
微wx笑 说:
相乘是很好的用法
2021年1月24日 17:10 | # | 引用
dongmu22 说:
它不是用了矩阵的相乘,只是将它们的一一对应位置上的数进行相乘,然后相加得到的结果
2023年8月 4日 16:46 | # | 引用
thy 说:
现在是2024年,
这个问题可以用卷积神经网络解决了
2024年2月29日 20:16 | # | 引用