OpenCVPython语言与信息数据获取和机器学习机器学习与计算机视觉

特征提取与图像处(三) 直方图 点算子

2017-06-02  本文已影响80人  热血沸腾

数字图像

因为一帧图像可以由像素矩阵组成,像素亮点是x,y轴相交的亮度点。这些概念在该系列一中已经描述的很清楚。

直方图

亮度直方图 : 表示每个亮度级在图像中的占有率
图像对比度: 是通过亮度级范围来度量的
回想一下,在系列一中我们看到了8位(bit)的图片,亮度级别是0~255, 数值越小颜色越暗。

图片.png

上图记住x轴y轴分别代表的含义 因此我们可以判断这张图白色太多,也就是太亮了。比较好的做法是使得整个分布较为平均,下面有很多图片例子
直方图应用较多的一个场景是摄影师看曝光度,对比度。
我们来看记下来一些列图片,感受一下

数码相机内的展示(该图对比度很均匀所以图片看起来亮暗合适,但亮色很多,因为白色桌子)

1.jpg

此图说明x轴代表亮度0(黑)~255

2.jpg

看一下彩色图片,不同颜色(红、绿、蓝、黄、白)这些颜色分别直方图

3.jpg

这幅图曝光太高并且浅色太多

4.jpg

这幅图与上方图片刚好相反(看起来像是经过ps处理过对比度的图)

6.jpg

应用

说了这么多,直方图到底有什么用呢? 可以让图像变清晰。不信就看下面2张图

原图

7.jpg

经过处理后的图片

8.jpg

该图片未处理时,会使得灰度过多,像素集中在照片中间。这个时候如果能把整个像素拉伸,使得白色和黑色部分靠谱多一些,照片就会变得清晰起来。

直方图计算

直方图的原理我们知道了“x轴是0~255亮度级,y轴代表该亮度的像素个数” 编程中,通过histogram算子即可得到。非常的简单,返回的是个二维数组。

点算子

图像处理中最基本的运算就是点运算。顾名思义就是针对每个像素点进行计算。比如我想让图片变亮及拉伸对比度,则让每个像素与一个标量,例如标量为2相乘,使得亮度级扩大一倍。相反的,我们就可以相除。例如我们把第一张眼睛图片变量

图片.png

点算子 可以进行加法和乘法操作来增强亮度 如下图

图片.png

锯齿算子

锯齿(sawtooth)算子 是另一种形式的线性算子。锯齿算子是用来增强图片的局部亮度和对比度(因为我们有时候是对照片的局部某个部分亮度对比度不满意)
看眼睛图,用锯齿算子处理后的结果

图片.png

算子有很多种 下面可以看图

图片.png

直方图正规化 (专业领域最常用)

就像本文最开始说的,直方图具有的意义是适当处理可以让图像变得更加清晰。我们还记得当时的直方图样子吗,我再发一次


图片.png

我们使用正规化进行拓展和位移,使得直方图的亮度级可以覆盖256个亮级。另外直方图正规化是线性变化,因此处理后的图片可以恢复到原图。

图片.png

眼睛清晰了!

但是要记住1,直方图均衡化非线性处理,图片无法还原
但是要记住2,直方图均衡化非线性处理,图片无法还原
但是要记住3,直方图均衡化非线性处理,图片无法还原
25

阈值处理

阈值(thresholding)处理 简单说,亮度范围是0~255,在这里面我取任意一个数,比如127 当图像中的像素值>=127时设置成255,相反当像素值<=127时设置为0 。 在当前矩阵中只存在 0255的值。也就是图片只存在黑白。就像熊猫看到的世界一样。这样做的好处是,适当的取值,可以把我们感兴趣点分离出来。如下面图

图片.png
通常很多时候我们使用Otsu 最受欢迎最优阈值处理方法。它可以选取最恰当阈值。 opencv上有提供现成算法thresholding 图片.png 图片.png

到目前为止,我们关注的都是全局方法。即对整帧图片继续处理。还有一些局部自适应方法,常常在字符识别前的文件图像二值化。

上一篇 下一篇

猜你喜欢

热点阅读