根据RGB值计算单个代表性的“像素值”

时间:2018-10-03 12:11:47

标签: image image-processing colors rgb

我的问题与这里的堆栈溢出讨论有关。

https://math.stackexchange.com/questions/161780/about-sum-of-squared-differences

讨论为我们提供了平方差之和的公式,并且给出了以下示例的答案。


例如,如果您要比较两个像素(即每个图像中一个像素),则区域为1个像素。假设它是第一行中的第五个像素:x = 0,y =4。f,g的像素值分别为10.3。对于一个2n1 = 1 => n1 = 0的区域,n2也是如此。

SSD =(f(x + i,y + j)−g(x + i,y + j)) 2
SSD =(f(0 + 0,4 + 0)−g(0 + 0,4 + 0)) 2
SSD =(f(0,4)−g(0,4))2
SSD =(10−3)2 = 49


我的问题是他如何从每个像素的RGB值中获得f(x,y)的像素值10和g(x,y)的像素值3? RGB不是单个值。那就是当我只有一个图像像素时,我具有三元组信息:我具有红色,绿色和蓝色值。如示例所提供的,如何从该RGB值变为单个值?

2 个答案:

答案 0 :(得分:3)

我假设他使用的是灰度颜色表示,其中值10和3对应于两个像素的亮度或光度。

一种将RGB转换为整数表示的方法:

$result = $count->fetchOne(); #or $count->fetch(); read the docs to the right method
echo $result[0];

... 但是,在此表示形式的值之间计算SSD将是没有意义的,这使我们面临通常计算色差的问题:任何将RGB展平为单一尺寸的尝试都将不可避免。折叠一些信息。

将RGB值表示为HSL / HSB / HSV可以使您更有意义地比较色相,饱和度或亮度(一次比较一个维度),但是很难一次折叠并一次比较所有三个维度。有意义的方式。

您可能会找到this条使用文章。

答案 1 :(得分:1)

(1)

  

“ ...如何从每个像素的RGB值中得到f(x,y)的像素值为10,而g(x,y)的像素值为3?”

这些似乎只是基本示例值,可以更轻松地说明他的观点。您仍然可以在计算中使用完整的RGB值(对于全白像素,为 eg: 16777215)。

另请参阅以下答案:How does sum of squared difference algorithm work?

(2)
相反,如果您更喜欢255作为白色像素的固定值,请参见以下内容:

  

“ RGB不是单个值...我有三元组信息:我有红色,绿色和蓝色值。如何从这个RGB值变成单个值呢?提供?”

获取您的input_rgb值并将其分解为R-G-B组件。

temp_R = input_rgb >> 16 & 0x0ff; in
temp_G = input_rgb >> 8 & 0x0ff;
temp_B = input_rgb >> 0 & 0x0ff;

然后获得单个代表值(像素的亮度)

value = (temp_R + temp_G + temp_B) / 3 ); //# averaged, gives range between 0 and 255

您可以通过执行value

进一步将结果(value / 255)减小到0到1之间。