Возможно ли нормализовать изображение в Java менее чем за 2 прохода?

1

Я хочу нормализовать изображение - разделите каждый цвет на изображении тем самым темным наблюдаемым. В настоящее время я делаю это, дважды повторяя изображение: один раз, чтобы выбрать самый темный общий цвет, а затем один раз, чтобы разделить каждый цвет на это.

Я не могу не чувствовать, что должен быть более эффективный способ сделать это. Я относительно новичок в обработке изображений в целом - я пропущу что-то очевидное?

Теги:
optimization
image
normalization

2 ответа

1
Лучший ответ

Рассмотрим изображение, имеющее только один черный пиксель # 000000. Ваш первый проход завершится с делением на ноль. Вы должны прочитать спецификацию формата изображения и искать использованную палитру или любые полезные данные и использовать эту формулу:

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

Когда вы повторяете цикл в первый раз, вы можете сделать копию каждого цвета (назовем массив copyOfImage). Следите за самым темным наблюдаемым цветом до сих пор и его индексом. Сделав копию каждого цвета по мере повторения цикла, разделите этот цвет на исходном изображении тем самым темным цветом, который наблюдался до сих пор. Когда вы находите новый темный цвет, вы заменяете старый, а также отслеживаете новый самый темный индекс цвета.

Когда вы достигнете конца первой итерации изображения, каждый цвет в исходном изображении будет разделен самым темным цветом, который был известен в то время, когда мы достигли этого цвета. Кроме того, у вас будет указатель того, где был найден самый темный цвет (назовем его darkestColorIndex) и самым темным цветом и копией изображения, прежде чем вы его отредактируете.

Теперь от darkestColorIndex до конца изображения будет правильно отредактирован, так как все цвета от darkestColorIndex до конца изображения будут разделены на самый темный цвет. Однако вам все равно нужно отредактировать 0 до darkestColorIndex. Поэтому от 0 до darkestColorIndex замените originalImage [i] на copyOfImage [i]/darkestColor (где я - текущий индекс).

Вы увеличиваете пространственную сложность по размеру изображения, и алгоритму все равно придется проходить через изображение максимум в 2 раза, если самый темный цвет был найден в последнем индексе изображения. Однако, если он был найден в первом индексе, ему нужно было бы перебирать его 1 раз. В среднем, вероятно, придется перебирать изображение в 1,5 раза.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню