1

我必须执行以下操作 -

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

这是我试图解决的一个更大问题的算法,我被困在这里,因为我不知道如何操作单元数组元素。

我将在单元格数组中有 256 个单元格,我必须比较和重新分配属于单个单元格的元素。请matlab高手帮忙。

4

1 回答 1

0

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

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

现在,根据强度值,从此数据生成直方图,其值位于 256 个唯一箱之一中。这应该很容易。

现在,只需计算每个 bin 中应该有的平均元素数(即:行 * 列 / 256),并将其四舍五入到最接近的整数。有了这个值,您就知道每个直方图“bin”中应该有多少像素。因此,在您的直方图中,您:

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

现在直方图已均衡化,您可以遍历其内容以重新创建原始 2D 图像。

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

最后一件事:如果您使用的排序算法不是一种稳定的排序,它或多或少会随机化哪些相同值的像素跨箱移动,这有助于防止移动具有相同强度的相邻像素簇价值观。

于 2013-09-17T21:38:01.957 回答