有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

是否可以在不到2次的过程中用Java规范化图像?

我想标准化一幅图像——将图像中的每种颜色除以观察到的最暗的颜色。目前,我通过在图像中循环两次来实现这一点:一次选择最暗的整体颜色,然后一次将每种颜色除以该颜色

我忍不住觉得必须有一种更有效的方法来做到这一点。一般来说,我对图像处理比较陌生——我是否遗漏了一些明显的东西


共 (2) 个答案

  1. # 1 楼答案

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

    new_color=(old_color-OLD_MIN)*(NEW_MAX-NEW_MIN)/(OLD_MAX-OLD_MIN)+NEW_MIN   
    
  2. # 2 楼答案

    第一次遍历循环时,可以复制每种颜色(我们称之为copyOfImage数组)。记录迄今为止观察到的最暗颜色及其索引。在循环中复制每种颜色后,将原始图像中的该颜色除以迄今为止观察到的最暗颜色。当你发现一个新的最暗的颜色时,你会替换旧的颜色,并跟踪新的最暗颜色的索引

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

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

    图像的大小会增加空间复杂度,如果在图像的最后一个索引处发现最暗的颜色,则算法可能仍需要在图像中最多迭代2次。然而,如果在第一个索引中找到它,它只需要在其中迭代一次。平均而言,它可能需要在图像中迭代1.5次