目录
前言
1、概述
2、FPGA实现直方图均衡化
参考文献
关于数字图像处理方面的学习,不要仅关注于书籍、博客等其他人是如何用FPGA实现的。
算法原理仅有一种,但实现方式可以多种多样。他人的实现方式,仅仅是一种参考!
所以,重点是对算法原理的理解和掌握,独立思考如何采用FPGA实现。这个过程比简简单单的看懂别人的代码重要许多倍!
在理解掌握算法原理之后,再有自己的初步实现设计之后,可以考虑对比一下其他人的设计思路,比较一下优缺点,思考如何做优化、如何提高速度、如何提高效率等问题。
书籍推荐阅读《数字图像处理(第三版)冈萨雷斯》。
本文整理学习了关于灰度直方图、直方图均衡化的相关概念理论,并尝试使用FPGA进行实现直方图均衡。
文后,附上所参考的博客链接。
概念一:灰度直方图
直方图:统计一副图像中各个灰度级出现的次数或概率;
我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是
是图像中所有的灰度数, 是图像中所有的像素数, 实际上是图像的直方图,归一化到 。
概念二:累计概率分布函数(又称为“ 累计归一化直方图 ”、“直方图累计和”)
把 作为对应于 的累计概率分布函数, 定义为:
则, 是图像的累计归一化直方图。
概念三:直方图均衡
注意:
概念2中的c(i),与概念3中的是相同含义,即累计概率分布。
概念四:直方图均衡的深入理解
直方图均衡化的作用是图像增强。
有两个问题比较难懂,一是为什么要选用累计概率分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。
第一个问题。均衡化过程中,必须要保证两个条件:
①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;
②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。
第二个问题。累积分布函数具有一些好的性质,那么如何运用累积分布函数使得直方图均衡化?比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。
直方图均衡化过程中,映射方法是:
其中,n是图像中像素的总和,是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
其中,n是图像中像素的总和,是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
关于上图,可以参考概念三种的公式进行理解。因为在FPGA实现直方图均衡化时,具体采用的是概念三中的公式,如下所示:
举例说明:
在第一行中,灰度值为DA=50,灰度级i=50,像素个数为H(i)=4,总像素个数为16,
由于灰度级范围在[0,255],但实际上只有50/128/200/255有数值,其他均为0,
所以,累计概率分布c(i)=c(50)=0.25=
在第二行中,灰度值DA=128,灰度级i=128的像素个数为3,总像素个数为16,
累计概率分布c(i)=c(128)=[0+0+...+H(50)+0+...+H(128)] / 16=(4+3) / 16 =0.4375
c(i) * Dmax = 映射后的灰度值。
映射后的图像如下所示:
以上就是直方图映射均衡化的步骤,当然还有一些基于此的更优算法,比如Photoshop中的方法,在此就不一一列举了,大同小异。
采用下面公式和步骤:
图片像素大小128x128,8位深度;
2.2 视频流直方图均衡化方案
未完,待续。缓更中
[1] https://www.cnblogs.com/tianyalu/p/5687782.html
[2] https://blog.csdn.net/LZY272942518/article/details/46663599
[3] https://blog.csdn.net/helimin12345/article/details/73395576
[4] 《数字图像处理(第三版)冈萨雷斯》