关于图像识别与处理的小探讨

关于图像识别与处理的小探讨

随着科技的进步与消费者的需求,图像识别与处理已经越来越广泛的应用在各个行业,最贴近生活的也就是人脸识别和场景识别,比如说近来的Apple手机和平板电脑上的结构光,华为最新系列手机运用的智能物体识别,更远的还有BAT所增加的图像查找功能,同时,在刑侦方面(如追捕逃犯),甚至公共文明行为方面(闯红灯检测)也有广泛的运用。另外,和大数据结合,将图像数据结构化也是前沿的研究方向。本文想结合最近在做的项目所需要的图像识别做一个小方面的探讨。

相机成像

谈到图像,我们就不得不提到它的获取。通常,图像是由数码相机拍摄得到的,它通过透镜投射光线,在图像传感器上面获取场景。
(捉鸡的手工图简单解释1)
在这里插入图片描述
d1 是透镜到影像平面的距离,d2是透镜到物体的距离,f为透镜焦距
关系公式为:1/f=1/d1 +1/d2
由于相机的参数有所不同,为了清楚的解释,在图像处理中,我们简化了相机模型,运用中学所学的针孔照相机模型。
(捉鸡的手工图简单解释2)
在这里插入图片描述
物体与它的图像的关系的基本投影方程为:
h1=(f*h2)/h1

当图像传感器接收到被摄物体的数据后,会将它的基本特征传输到每个像素点里,这样,我们便又了下一步操作,对图像进行处理。

图像处理

图像处理方面就拿博主正在处理的寻迹识别模块所用的工具来引入一个方法。
图像本质上就是一个数值组成的矩阵,通过计算机视觉领域使用最广泛的OpenCV,我们运用cv::Mat结构来操作图像。每一个在矩阵中的元素表示一个像素。对于黑白图像(灰度图像),像素是8 位unsigned型数字,范围是0~256。对于彩色图像,需要用三原色数据来构建不同的可见色,常用的主演是通道为红,绿,蓝也就是RGB通道。
我们可以通过OpenCV来进行各种对图像的操作,最基础的就是装载,显示与存储图像,利用好

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

这两个头文件和它所包含的API,我们可以熟练的掌握并变换图片的各种特征。如:cv::Size可以让我们了解矩阵的高度和宽度,cv:Vec3b这个向量可以来表示包含RBG三个颜色的数据并用channel索引来指明三个通道中的具体一个。并且通过对图像矩阵的扫描(指针,迭代器),来对图像进行操作。
另外,想要对图像进行更高级的操作,就需要利用好算法相关的数学知识(构造函数)。我们可以自己设计函数,也可以利用OpenCV里已经存在的函数(真的很好用),如利用cv::cvtColor来转换颜色。

cvtColor(srcImage, grayImage, CV_BGR2GRAY);
//change the picture into grayscale image
cvtColor(srcImage, HSVImage, COLOR_BGR2HSV);
//change the picture into HSV image  

图像是由不同颜色的像素构成的,像素值在图像中的分布情况是图像的重要属性,于是直方图便可以拿来统计像素的数量,我们一般通过调用cv::calcHist

cv::calcHist(&image,
   1,//histogram for single image
   channels,//the used channels
   cv::Mat(),//do not use masks
   hist,//gotten histogram
   3,//three-dimensional histogram
   histSize,
   ranges//The range of pixel values
);

函数来处理多通道的图像,我们也通过像素值的分布情况来修改和改进图像质量(利用查找表或映射函数cv::LUT),当然,也能用积分图像来统计像素cv::integral

void integral( 
    InputArray src, // input image as W*H,8-bit or floating-point
    OutputArray sum, // integral image as(W*H)*(H+1), 32-bit integer or floating-point
    OutputArray sqsum, // integral image for squared pixel values; it is (W*H)*(H+1), double-precision floating-point array
    OutputArray tilted, // integral for the image rotated by 45 degrees;
    int sdepth = -1, //the target depth
    int sqdepth = -1 
);

滤波也是图像处理里面需要着重的操作,去除图像中的噪声,提取有用的视觉特征,对图像重新采样。利用如类似于Sobel或者Laplacian算子(二阶导数求和),来检验边缘或度量图像函数的曲率。
此外,利用Canny算子cv::Canny

cv::Canny(image,//grayscale image
          contours,//output the contours of the image
          100,//Low threshold
          300,//High threshold
          );

来检验图像的轮廓(cv::Mat contours)和霍夫变换检测直线,或者用cv::findCountours来提取图像中连通区域的轮廓。

OpenCV 是个很基础,又很有用开源程序库(就像它的名字全称一样Open source Computer Vision Library),通过多年的分析和优化,它在计算机视觉领域成为了主要的开发工具,可以看见的是,由于它的高效性和开源性,在未来几年,无论是学术上还是商业用途上来看,都是处于领先地位。另外,Matlab也是一个很高效的图像处理工具。

从上面提到的几点OpenCV能对图像做到的事情,博主深切地感到,像Photoshop这样的大厂软件是有多么不简单,能够极大程度上方便多媒体工作者和对图片有着修改需求的消费者。

而当前社会关心的点,在前些年对照片处理的热潮过后(比如说美图,美颜,给相片加上滤镜),转移到了人脸识别上面。归根结底还是移动设备的普及与进步(人脸解锁,移动支付软软件刷脸支付,密码锁),同时还有公共设施的完善(比如天眼,公共场合“刷脸”进场),让人们与图像识别的距离逐渐缩短,也是科技照亮生活的一种体现。当然,这种普及往往会带来一些无法避免的问题,如在电子设备覆盖下的个人隐私。这时候,除了要求相关部门和有关公司加强信息的保护以外,我们还能做的,就是参与到相关科技的开发中来,对图像处理进行加密,压缩和储存,改善图像传输的方法,让大众能够享受便利的同时,能确保个人隐私不被泄漏和被怀有歹心之徒利用。这就是未来我们所研究并且运用的方向。

在未来,随着科技的发展和人民日益增长的需求,图像识别不仅仅会运用在我们民众普遍认识的人脸识别,汽车安全驾驶,运动跟踪,动作识别上,还会运用在机器视觉,结构分析,人机交互上(没错,就是TNT,未来的产品),每一步都需要相关研究学者和从业人员不断的实践,修正和优化,在阅读IEEE上面的几个相关学科的论文后,我们可以发现,其实现在的研究对于图像处理已经到了一个很深的地步,如压缩,编码,滤波,加密(这里小小安利一下UESTC曾兵教授的,在IEEE上有过发表的很多篇图像处理的文章,如Directional Discrete Cosine Transforms for Image Coding和Optimal median-type filtering under structural constraints都是极其出色的研究成果)以后想要在这方面有所贡献,必须要付出相应的努力。

今天写下这篇文章,也是对这一个学科的初步认识和理解,也是对这个学科的一个展望,更有的是对自己的勉励,希望能在这些强大的工具支持下,和学科优秀的榜样光辉的照耀下,能够好好学习,应用,实践。

参考资料索引:

1. Robert Laganiere,2015,OpenCV计算机视觉编程攻略
2. Bing Zeng,1995,Optimal median-type filtering under structural constraints
3. Bing Zeng,2008,Directional Discrete Cosine Transforms—A New Framework for Image Coding

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值