请教:关于RGB到灰度图像的转换。
各位大侠们,在网上找了下好像没有用fpga将rgb图像转换成灰度图像的相关算法。因为里面涉及浮点运算,据说是因为用fpga来做的话,会很麻烦而且速度并不会很快。Gray = 0.299 * R + 0.587 * G + 0.114 * B,除法相当的耗费资源。灰度化是图像处理和模式识别的基础,我想问一下,在fpga上面一般是怎样实现灰度化的。我看有很多人说:1,直接用g分量代替其他的分量;2,直接用r=1/3r+1/3g+1/3b,g=1/3r+1/3g+1/3b,b=1/3r+1/3g+1/3b,
有没有标准的算法啊? 高度关注。 可以考虑定点近似公式,如:1024Gray = 306 R + 601 G + 117 B。实际上是公式两端同时乘以数,得到xG=aR+bG+cB;舍入为定点,调整并保证x=a+b+c。原始运算成为定点乘加和,然后移位。由于是右移,等价于低位舍弃,不需要实际的移位操作。
值得考虑的:
- Gray侧乘数为2的整次方,此时除法用移位代替。FPGA上就是舍弃低位。因此变为乘加和形式。
- 乘数是多少为最佳,需要另行写程序算一下。看原始浮点公式的整数舍入结果和定点公式结果误差的度量。针对特定公式,不一定越大越好。
浮点定点化是常干的事情。 http://www.cnblogs.com/oomusou/archive/2008/07/14/1242946.html
http://www.cnblogs.com/oomusou/archive/2008/08/23/de2_cmos_gray.html
参考这两个贴子 嗯,今晚上来看看二楼的算法。谢谢大家。 给你找个文件。。。
点击此处下载 ourdev_538406.pdf(文件大小:602K) (原文件名:让你的程序飞起来.pdf) 如果不十分要求精度,把乘法拆成加法,例如:16 Gray = (4 + 1) R + (8 + 1) G + 2 B => ((G + R) + (4R + 2B)) + 8G = 16 Gray。变成纯粹的移位/加法实现。后边的变形主要是节约加法器资源,适当优化加法路径而已。反正没太发现有啥太好做的。
反正都是原始公式的近似。算法到是看你的FPGA有多少资源,对速度等等有啥要求了。
5楼的文档后来是关于处理器的优化技巧,转换到FPGA上就是面积,速度的讨论,也有一些可做的事情。查表法可以有更好的优化结果。
修改补充:
- LZ的公式,是从RGB到Y的变换公式,提取的是RGB中的亮度信息。人眼对于亮度,远比其余的两个分量敏感。具体原理请参考JPEG压缩算法的介绍。它的第一步就是RGB到YCbCr的变换。
- 从人眼敏感度来看,敏感程度G>R>B,这也是在变换中体现出来的信息。和RGB各取1/3获得灰度相比,这个R/G/B不等权的变换更好的体现了人眼对于亮度的需求。换句话说,RGB比例越接近原始的那个公式的比例,主观感觉应该会更好一些。
补充的是根据一些额外信息的猜测,仅供参考和讨论。 关注! 用FPGA来做没有问题的,参考一下浮点运算的方法很快就搞定了。
我曾经转换过YCbCr->RGB和RGB->YCbCr,很容易的。 嗯,我来汇报下结果。
事实证明采用dr2001 的算法是可行的,能够实现灰度转换,而且我将采用这种方法的灰度转换和只用绿色分量做出来的灰度图进行比较,发现两者差别真的不大。可以考虑以后就用简单的绿色分量代替其他分量的算法。
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_538513.JPG
(原文件名:rgb图像.JPG)
由于我灰度转换是在数据存入到sdram中之后才用的灰度转换,因此只能在显示器上看到效果,所以这里上传的只有rgb图像。
什么时候我把那个灰度转换模块搞到sdram之前去。 有灰度LCD嘛,4阶16阶的 怎么都能实现灰度转换,只不过看提取什么样的亮度信息。
单分量肯定是不够的,至少需要R+B+2G这样的类似DC的采样点阵。否则纯蓝和纯黑在单一分量下没区别。 mark RGB转换成YUV,提取亮度信号 mark 下载了5楼的文件,谢谢楼上诸位。 MARK 强烈mark 学习了!!! 学习了 关注中…… mark
页:
[1]