创建直方图

时间:2015-11-21 02:22:43

标签: java arrays

对于一项任务,我收到了一些我无法遵循的可怕指示,而且我的教授在发送电子邮件时速度很慢,所以我想我会在这里得到更好的答复。

最初的目标是使用公式{r,g} = {R,G}/(R+G+B)将正常颜色RGB转换为色度。然后我们要创建一个直方图,其中r和g是轴'。箱数应等于1 + log2(n) where n = number of rows

这怎么可能?假设我们有一个4x4的数组,我们必须创建一个3x3矩阵的直方图,这不会均匀分配,我们会有问题......

以下是项目规范:

  

事实证明,如果我们用RGB替换颜色,我们也知道   色度{r,g} = {R,G} /(R + G + B)则图像很多   被成像的表面的更多特征,而不是   光照亮那些表面。所以,而不是颜色,{R,G,B},   让我们使用色度{r,g}。 [但请注意黑色,即{R,G,   B} = {0,0,0},像素。]

     

关于色度的好处在于它是2D。所以我们的直方图是   一个二维数组,r沿一个轴,g沿另一个轴。该   色度必然在区间[0,1]中。但是有多少箱子   我们应该沿着每个轴使用?应用(廉价版)的规则   拇指称为Sturges的规则,箱数N = 1 + log2(n),其中   n =数据大小,所以粗略的想法是使用n =行数,例如   沿r和g方向中的每一个N = 7个区间。这使我们的   直方图,H,一个小的7×7整数值数组。如果我们正常化   为了使H的总和等于1,那么我们有一个浮点数组。

要求任何人做这项工作,我只是要求澄清是否有人知道如何做到这一点。

目前我能够获得色度值:

       for(int i= 0; i < 1280; i++) {
            for(int j = 0; j < 720; j++) {
                rgb = resTemp.getRGB(i, j);

                R = (rgb >> 16) & 0xFF;
                G = (rgb >> 8) & 0xFF;
                B = (rgb) & 0xFF;

                r = R/(R+G+B);
                g = G/(R+G+B);
                b = B/(R+G+B);

            }
        }

2 个答案:

答案 0 :(得分:2)

您的2D色度值在0..1,0..1

范围内
r = R/(R+G+B);
g = G/(R+G+B);

这意味着对于每个像素,你有一个2d值,你可以放在这个连续空间中的某个地方

^ R
|(1,0)
|
|(0,0)    (0,1) G
|----------->

如果您以2x2的方式对其进行分类,则将每个分配到bin中,如

R
^
|-------|------|
|  bin  | bin  |
|       |      |
|-------|------|
|  bin  | bin  |
|       |      |
|-------|------|>G

E.g。值[0.3,0.2]进入左下角。 [0.9,0.9]进入右上角。你也可以将它变成更精细的7x7网格。

现在,您遍历所有[r,g]值并计算进入哪个bin的值。结果可能就像

  30  |  12
 ------------
  4   |  12

这是直方图H.

现在,您可以通过将值转换为百分比来对其进行标准化。这是通过除以总数来完成的。例如。第一个30 / (30+12+4+12)。最后的结果是一系列花车。

  0.5 |  0.2
 ------------
  0.0 |  0.2

答案 1 :(得分:1)

免责声明:本网站上的无人可以为您提供有关如何解释作业问题的明确说明。您将不得不问任何人将此任务分配给您。

那就是说,在我看来你误解了直方图的概念。直方图中的区间数不需要除以图像中的像素数。

让我们举一个小例子。以你的4×4像素图片为例(实际上它太小而无意义),假设各像素具有以下( r g )值(您使用给定的公式事先计算过的。)

(0.162153, 0.888718) (0.712812, 0.531226) (0.604891, 0.348852) (0.948258, 0.439340) 
(0.109330, 0.891049) (0.600158, 0.697887) (0.420215, 0.132211) (0.187572, 0.404733) 
(0.321997, 0.372477) (0.053720, 0.134205) (0.662678, 0.775244) (0.717968, 0.761581) 
(0.185886, 0.622118) (0.527020, 0.676139) (0.612300, 0.059857) (0.507551, 0.136314) 

现在您要计算3×3直方图,沿第一个轴的 r 值和沿第二个轴的 g 值。由于您的值来自区间[0,1],并且沿每个轴有三个区间,因此这些区间为[0,1 / 3),[1 / 3,2 / 3]和[2 / 3,1]。 (你想如何处理舍入和向下取决于你。)对于每个( r g )对,你必须决定它是什么bin 。因此,例如,第一对(0.162153,0.888718)进入bin(0,2),因为0.162153∈[0,1 / 3]和0.888718∈[2 / 3,1]。如果你对16对数字中的每一对都这样做,并记录你击中每个bin的次数,你应该得到以下直方图。

1    3    2 
3    1    3 
0    2    1