【问题标题】:distributing equal number of pixels in each intensity level在每个强度级别中分配相等数量的像素
【发布时间】:2013-09-21 22:19:59
【问题描述】:

我必须执行以下操作 -

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

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

我将在元胞数组中有 256 个元胞,我必须比较和重新分配属于单个元胞的元素。请Matlab专家帮忙。

【问题讨论】:

  • 听起来很像histogram equalization?这就是你所追求的吗?
  • 如果您有图像处理工具箱,您需要histeq,它会为您完成所有工作。
  • 是直方图均衡化,但必须手动使生成的直方图变平,而不使用任何内置函数。
  • 我已经成功地完成了这样的累积直方图均衡,但我不知道如何以手动方式平均分配像素。 (逻辑是计算像素,将它们除以 256,每个强度级别必须有许多像素)
  • 下面是完整的算法。

标签: arrays matlab image-processing histogram


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多