可以在不到2遍的情况下在Java中规范化图像吗?

时间:2015-03-07 20:37:36

标签: java image optimization normalization

我想要对图像进行标准化 - 将图像中的每种颜色除以最暗的图像。目前,我通过在图像中循环两次来完成此操作:一次选择最暗的整体颜色,然后一次将每种颜色分开。

我无法感觉必须有一种更有效的方法来做到这一点。我对图像处理一般都比较新 - 我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

考虑只有一个#000000黑色像素的图像。你的第一遍将失败,除以零。您应该阅读图像格式规范并查找使用过的调色板或任何有用的数据,并使用以下公式:

new_color=(old_color-OLD_MIN)*(NEW_MAX-NEW_MIN)/(OLD_MAX-OLD_MIN)+NEW_MIN   

答案 1 :(得分:1)

当你第一次遍历循环时,你可以制作每种颜色的副本(让我们称之为copyOfImage数组)。跟踪到目前为止最黑暗的观察颜色及其指数。在迭代循环时制作每种颜色的副本后,将原始图像中的这种颜色除以目前为止观察到的最暗颜色。当您找到一种新的最暗颜色时,您将替换旧颜色,并跟踪新的最暗颜色的索引。

当您到达图像的第一次迭代结束时,原始图像中的每种颜色将被我们达到该颜色时已知的最暗颜色除以。此外,在编辑之前,您将获得找到最暗颜色的位置的索引(让我们称之为darkestColorIndex)和最暗的颜色以及图像的副本。

现在从darkestColorIndex到图像的末尾将被正确编辑为darkestColorIndex中的所有颜色,直到图像的末尾被正确的最暗颜色分割。但是,您仍然需要将0编辑为darkestColorIndex。因此,从0到darkestColorIndex,用copyOfImage [i] / darkestColor(其中i是当前索引)替换originalImage [i]。

您通过图像的大小增加空间复杂度,如果在图像的最后一个索引处找到最暗的颜色,则算法可能仍然必须以最多2次迭代图像。但是,如果在第一个索引中找到它,它只需要迭代它一次。平均而言,它可能需要遍历图像1.5次。