在每个强度级别分配相同数量的像素

时间:2013-09-17 12:56:32

标签: arrays matlab image-processing histogram

我必须做以下事情 -

1)找到属于强度级别0到强度级别255的像素,并将它们存储在256个阵列中 2)将像素从一个强度级别重新分配到另一个强度级别,以便所有256个级别具有相同的像素。

这是我想要解决的更大问题的算法,我被困在这里,因为我不知道如何操纵单元格数组元素。

我将在单元阵列中拥有256个单元格,并且我将比较和重新分配属于单个单元格的元素。 Matlab专家请帮忙。

1 个答案:

答案 0 :(得分:0)

算法很简单。从二维图像矩阵创建一维数据阵列。数组的每个元素都有四个属性:

  • x位置
  • y位置
  • [0,255]
  • 的强度值
  • 优先级(默认为每个像素为零)

现在,根据强度值,根据此数据生成直方图,其值为256个唯一区间之一。这应该很容易。

现在,只计算每个bin中应该有的平均元素数(即:rows * columns / 256),并将其四舍五入到最接近的整数。使用此值,您可以知道每个直方图“bin”中应有多少像素。所以,在你的直方图中,你:

  • 循环通过256个直方图箱中的前255个
    • 计算箱中值的数量是高于还是低于平均值。
    • 如果当前bin中的像素太多:
      • 按照“优先级”值按升序对每个bin中的像素进行排序(即:从0开始;优先级越高,LESS可能会移动像素)。
      • 获取具有最低优先级的像素,并将像素移动到下一个bin(即:增加其强度值),并增加其优先级值。
      • 重复此操作,直到当前bin中的像素数等于预期值(即:Rows * Columns / 256)。
  • 最终的bin,bin#255(即第256个bin)中可能会出现太多项目。你可以通过在直方图上重复上述算法来解决这个问题,但反之亦然。但是,这次按优先级降序排列像素。因此,优先级值越高,移动的可能性就越大。当你这次移动这个像素时,你会递减它的强度值和优先级,而不是递增它们。

现在直方图是均衡的,你可以循环它的内容来重新创建原始的2D图像。

“优先级”值非常重要,因此您不会意外地将像素移动到比所需更多的区域,从而导致高斯噪声或甚至脉冲/椒盐噪声。 整体算法应该是O(n^2),所以它在性能方面应该是不错的。

最后一件事:如果您使用的排序算法不是一个稳定的排序,它会或多或少地随机化哪些相等值的像素在二进制位上移动,这有助于防止移动一组相邻像素具有相同的强度值。