我正在制作一个使用C和ARM程序集的程序,我需要做的一件事就是将RGB图像转换为灰度图像。所以我的教授给了我这段代码只是为了理解它是如何工作的:
int rgb2gray(pixelRGB pixel){
return ( (2048*pixel.R + 4096*pixel.G + 512*pixel.B) /(8*1024));
}
此功能将RGB值转换为灰色。
任何人都可以解释该算法是如何工作的以及为什么要使用这些确切的值(2048,4096,512 ......)。
答案 0 :(得分:3)
要将RGB数据转换为灰度,您需要将3个数字转换为一个。因此,2048,4096和512只是每种颜色的基本权重,即每种颜色对灰度和亮度的影响程度"。
考虑到最后一项,权重基本上是2 / 8,4 / 8和0.5 / 8。对于整数运算,我们必须先乘以然后除。这解释了操作的顺序。
对于CPU来说,乘法和除法运算非常昂贵,即移位比乘法或除数要快得多。这就是为什么我们使用的所有数字都是2的幂。编译器足够智能以将pixel.B * 512替换为pixel.B<<换句话说,将常数改为6K会大大减慢转换时间。
答案 1 :(得分:1)
有三种不同的常数,因为绿色比红色和蓝色更亮,而红色仍然比蓝色更亮。
假设颜色分量值的8位值以及灰度值,则不能很好地选择此函数中的常量。
可以假设#000000(RGB颜色)变为#00(灰度)而#ffffff变为#ff。
对于给定的常数,情况并非如此;此函数返回的最大灰度值为207.您应该用6644替换(8 * 1024)以获得更好的结果。