Как работает cv2.merge ((r, g, b))? - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь сделать линейный фильтр для изображения с цветами RGB. Я нашел способ сделать это, разделив изображение на разные цветовые слои и затем объединив их.

т.е.:

cv2.split(img)
Sobel(b...)
Sobel(g...)
Sobel(r...)
cv2.merge((b,g,r))

Я хочу узнать, как работает cv2.merge((b,g,r)) и как окончательное изображение будет построено.

Ответы [ 2 ]

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

cv2.merge берет одноканальные изображения и объединяет их в многоканальное изображение. Вы запустили алгоритм обнаружения ребер Собеля для каждого канала по отдельности. Затем вы объединяете результаты в окончательное изображение. Если вы объедините результаты вместе, на первый взгляд это может не иметь смысла визуально, но то, что вы будете отображать, это результаты обнаружения краев всех трех плоскостей, объединенных в одно изображение.

В идеале, оттенки красного скажут вам сила обнаружения краев в красном канале, оттенки зеленого, дающие силу обнаружения для зеленого канала, и, наконец, синие оттенки для силы обнаружения в синем.

Иногда это хорошая отладка инструмент, так что вы можете семантически увидеть всю информацию о краях для каждого канала в одном изображении. Тем не менее, это, скорее всего, будет очень трудно интерпретировать для очень сложных изображений с большой текстурой и активностью.

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

В качестве примера первого можно разложить изображение RGB на HSV и использовать информацию о цвете в этом пространстве для лучшего обнаружения края. Посмотрите этот ответ Мики: OpenCV Обнаружение границ / границ по цвету .

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

Это мое понимание. В OpenCV функция split () примет входной сигнал с темпом изображения (будучи многоканальным массивом) и разделит его на несколько отдельных одноканальных массивов.

Внутри изображения каждый пиксель имеет пятно, последовательно расположенное в массиве, причем каждый пиксель имеет свой собственный массив для обозначения (r, g и b), следовательно, термина многоканальный. Эта настройка позволяет разделять изображения любого типа, такие как bgr, rgb или hsv, используя одну и ту же функцию.

В качестве примера (представьте, что это отдельные примеры, поэтому никакие переменные не перезаписываются)

b,g,r = cv2.split(bgrImage)
r,g,b = cv2.split(rgbImage)
h,s,v = cv2.split(hsvImage)

Например, b,g,r arrayts. Каждый массив из одного канала содержит часть разделенного изображения RGB.

Это означает, что изображение разделяется на три отдельных массива:

rgbImage[0] = [234,28,19]

r[0] = 234
g[0] = 28
b[0] = 19

rgbImage[41] = [119,240,45]

    r[41] = 119
    g[14] = 240
    b[14] = 45

Слияние делает обратное, беря несколько одноканальных массивов и объединяя их вместе:

newRGBImage = cv2.merge((r,g,b))

порядок, в котором пропущены разделенные каналы, становится важным с этой функцией.

КОД SUDO:

cv2.merge((r,g,b)) != cv2.merge((b,g,r))

В качестве отступления: Cv2.split () - дорогостоящая функция, и использование индексации numpy должно быть более эффективным.

Для получения дополнительной информации ознакомьтесь с opencv python учебными пособиями

...