Коэффициенты линейной матрицы датчика изображения (цветопередача), как они применяются?

#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, это совершенно отдельный вопрос — ищите калибровку цвета камеры, «диаграмму Макбета» и т.д.