#c #opencv #image-processing
#c #opencv #обработка изображений
Вопрос:
У меня есть несколько необработанных изображений, к которым нужно удалить, а затем применить цветокоррекцию / преобразования. Я использую OpenCV и C , а для используемого датчика изображения коэффициенты линейной матрицы равны:
1.32 -0.46 0.14
-0.36 1.25 0.11
0.08 -1.96 1.88
Я не уверен, как применить их к изображению. Мне непонятно, что я должен с ними делать и почему.
Кто-нибудь может объяснить, что это за значения цветопередачи или цветовой матрицы и как их использовать для обработки изображения?
Спасибо!
Ответ №1:
Ваш вопрос неясен, потому что, похоже, вы также не знаете, что делать.
«что я должен с ними делать»
Первое, что приходит мне в голову, вы можете свернуть изображение с помощью этой матрицы, используя filter2D. Согласно документации filter2D
:
Свертывает изображение с ядром.
Функция применяет произвольный линейный фильтр к изображению. Поддерживается работа на месте. Когда диафрагма частично выходит за пределы изображения, функция интерполирует значения пикселей выбросов в соответствии с указанным режимом границы.
Вот пример фрагмента кода, который hpw tp использует:
Mat output;
Mat kernelMatrix = (Mat_<double>(3, 3) << 1.32, -0.46, 0.14,
-0.36, 1.25, 0.11,
0.08, -1.96, 1.88);
filter2D(rawImage, output, -1, kernelMatrix);
Комментарии:
1. Этот ответ в корне неверен. Следует удалить.
2. Когда люди видят что-то впервые в своей жизни, они пытаются сделать это похожим на то, что они видели раньше. Такова человеческая природа
3. Это нормально, но оставление неправильного ответа (особенно принятого, который заметно отображается в поиске) оказывает медвежью услугу сообществу. Вот почему я рекомендую удалить его.
Ответ №2:
Перед деблокацией у вас есть массив B (-ayer) значений «серого уровня», отфильтрованных MxN. Они физически фильтруются в том смысле, что на количество фотонов, измеренных каждым из них, влияет цветовой фильтр поверх каждого узла датчика.
После деблокирования у вас есть массив C (-olor) значений MxNx3 BGR, полученный (по существу) путем переиндексации массива B. Однако каждое из 3 значений в местоположении изображения (строка, столбец) представляет 3 физических измерения. Это не окончательное изображение, потому что нам все еще нужно «преобразовать» физические измерения в числа, которые представляют цветовые каналы, воспринимаемые человеком (или, в более общем плане, предполагаемым пользователем, который также может быть каким-то программным обеспечением для обработки изображений). То есть физические значения должны быть сопоставлены с цветовым пространством.
Имеющаяся у вас матрица «цветокоррекции» 3×3 представляет собой одно из возможных отображений — простое линейное. Вам нужно применить его по очереди к каждой тройке BGR во всех (строка, столбец) местоположениях пикселей. Например (в python / numpy / cv2):
import numpy as np
def colorCorrect(img, M):
"""Applies a color correction M to a BGR image img"""
rows, cols, depth = img.shape
assert depth == 3
assert M.shape == (3, 3)
img_corr = np.zeros((rows, cols, 3), dtype=img.dtype)
for r in range(rows):
for c in range(cols):
img_corr[r, c, :] = M.dot(img[r, c, :])
return img_corr
Комментарии:
1. Итак, как применяется цветокоррекция? Например, что представляют значения цветокоррекции и добавляются ли они к пикселю, умножаются или что? Это то, с чем я боролся. Я не могу найти, как применить эту матрицу значений к изображению для достижения коррекции цвета. Я не уверен, что здесь делает код … возможно, добавьте некоторые комментарии к циклам for, пожалуйста? Спасибо за ответ!
2. Посмотрите на код в моем ответе: что «M.dot (img[r, c, :])» является матрично-векторным умножением. Выходной красный цвет равен точечному произведению первого ряда, умноженному на M входных RGB (с разделением) в три раза, выходной зеленый цвет равен точечному произведению второго ряда, умноженному на M входных RGB, и т.д. Если вы спрашиваете, как найти значения M, это совершенно отдельный вопрос — ищите калибровку цвета камеры, «диаграмму Макбета» и т.д.