Удалить цветовой оттенок с помощью libvips - PullRequest
0 голосов
/ 09 января 2020

У меня есть изображения sRGB с цветными оттенками. Чтобы удалить его вручную, я обычно использую Photoshop Level Adjustments . В Photoshop также есть инструменты для этого: Автоконтраст или даже лучше Автоцвет , который также учитывает тени, средние тона и блики.

Если я удаляю слепок вручную, отрегулируйте каждый из каналов RGB по отдельности, чтобы самые темные пиксели были настроены на чистый черный, а самые светлые - на чистый белый, а затем перераспределили все остальные значения (распространяя гистограмму). Это простой подход, но показывает хорошие результаты для моих изображений.

В моем приложении node.js я использую sharp для обработки изображений, которая использует libvips в качестве механизма обработки. Я попытался удалить приведение с помощью .normalize(), но эта команда работает на всех каналах вместе, а не индивидуально для каждого из каналов RGB. Так что это не работает для меня. Я также задал этот вопрос на острой странице проекта. Я проверил предложение от lovell, чтобы попробовать его с hist_local, но результаты не пригодны для меня.

Теперь я хотел бы узнать, как это можно сделать с помощью встроенных libvips. Я играл с nip2 GUI и различными командами, но не мог понять, как этого достичь:

  1. Гистограмма> Гистограмма выравнивания> Глобальная => Изображение выглядит насыщенным
  2. Image> Levels> Scale to 0 - 255 => Каналы не все распространяются от 0 - 255 (я не совсем понимаю, что делает эта команда?)

Спасибо за каждый совет!

Добавление Вот пример с фотографиями из Photoshop, чтобы показать, что я хочу.

Исходное изображение - это изображение кадра из негатива фильма. Изображение перед обработкой

Step1 Инвертированное изображение Изображение после инверсии

Step2 с использованием автоматического тона в Photoshop (работает так же, как мое описание выше о ручном удалении цветового оттенка) Изображение после автоматического тона

Это последнее изображение мне подходит.

Ответы [ 3 ]

1 голос
/ 10 января 2020

nip2 имеет пункт меню для этого.

Загрузите ваше изображение и отметьте область на нем, содержащую область, которую вы хотели бы видеть нейтральной. Это может быть любая легкость, она не обязательно должна быть белой.

  • Используйте File / Open, чтобы открыть диалоговое окно файла, и вы должны увидеть изображение, загруженное в ваше рабочее пространство, в виде эскиза.
  • Дважды щелкните по миниатюре, чтобы открыть окно просмотра изображений.
  • В окне просмотра увеличьте масштаб и переместите курсор в нужное место. В руководстве пользователя (нажмите F1) есть раздел, посвященный навигации по изображениям.
  • Удерживая нажатой клавишу CTRL, щелкните и перетащите вниз и вправо, чтобы отметить прямоугольную область angular.

image view window with marked region

Вернувшись в главное окно, выберите Инструменты / Задачи / Захват / Баланс белого. Вы должны увидеть что-то вроде:

white balance widget

Вы можете перетащить изменить свой регион, чтобы изменить нейтральную точку. Используйте палитру цветов, чтобы установить, что означает белый цвет. Вы можете сделать другие белые с помощью (например) Color / New / Color из CCT и связать их вместе.

  • Нажмите Color / New / Color из CCT, чтобы сделать палитру цветов из CCT (коррелированная цветовая температура ) - температура в Кельвинах этого белого цвета.
  • Установите что-то интересное, например, 4800 для теплого белого.
  • Нажмите на формулу для A5.white, чтобы отредактировать ее, и введите ячейку вашего виджета CCT (в данном случае A7) .

Теперь вы можете перетащить область, чтобы настроить пиксели для установки нейтрального значения, и перетащить ползунок CCT, чтобы установить температуру.

custom white

Это может раздражать, чтобы найти вещи в меню инструментария. Есть что-то для поиска наборов инструментов: в главном окне нажмите View / Toolkit browser. Вы можете ввести что-то вроде «white», и он покажет соответствующие записи инструментария.

0 голосов
/ 17 января 2020

Тем временем я нашел Алгоритм простейшего цветового баланса , который точно описывает проблему с цветовыми оттенками, и там вы также можете найти исходный код C.

Это точно такое же решение, которое Джон описывает в своем втором ответе, но в виде небольшого фрагмента c -кода.

Я сейчас пытаюсь использовать его как аддон C / C ++ с N-API под node.js.

0 голосов
/ 17 января 2020

Вот еще один ответ, но с использованием pyvips и ответом на предыдущие комментарии. Я не хотел удалять первый ответ, поскольку он все еще казался полезным.

Эта версия находит гистограмму изображения, ищет пороги, которые будут выбирать 0,5% и 99,5% пикселей в каждой полосе изображения, а затем изменяет масштаб изображение таким образом, что эти значения пикселей становятся 0 и 255.

import sys
import pyvips

# trim off this percentage of pixels from the top and bottom
trim_percent = 0.5

def percent(hist, percentage):
    """From a histogram, find the threshold above which lie 
    @percentage of pixels."""
    # normalised cumulative histogram
    norm = hist.hist_cum().hist_norm() 

    # column and row profile over percentage
    c, r = (norm > norm.width * percentage / 100).profile()

    return r.avg()

image = pyvips.Image.new_from_file(sys.argv[1])

# photographic negative
image = image.invert()

# find image histogram, split to set of separate bands
bands = image.hist_find().bandsplit()

# for each band, the low and high thresholds
low = [percent(band, trim_percent) for band in bands]
high = [percent(band, 100 - trim_percent) for band in bands]

# rescale image 
scale = [255.0 / (h - l) for h, l in zip(high, low)]
image = (image - low) * scale

image.write_to_file(sys.argv[2])

Кажется, что это дает примерно аналогичные результаты для кнопки PS. Если я бегу:

$ ./autolevel.py ~/pics/before.jpg x.jpg

Я вижу:

result of script on sample image

...