opencv, BGR2HSV создает множество артефактов

введите здесь описание изображения

Это изображение является просто примером. Вверху справа — исходное изображение, вверху слева — оттенок, внизу слева — насыщенность, а внизу справа — значение. Как легко увидеть, H и S заполнены артефактами. Я хочу уменьшить яркость, чтобы в результате было много артефактов.

Что я делаю неправильно?

Мой код просто:

vc = cv2.VideoCapture( 0 )
# while true and checking ret
ret, frame = vc.read()
frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.imshow("h", frame_hsv[:,:,0])
cv2.imshow("s", frame_hsv[:,:,1])
cv2.imshow("v", frame_hsv[:,:,2])

person Dr Sokoban    schedule 21.06.2013    source источник
comment
Можете ли вы включить полный воспроизводимый пример, включая код, который вы использовали для чтения на изображении, и записать новый? (Включение исходного изображения также было бы полезно)   -  person David Robinson    schedule 21.06.2013
comment
Я изменил его с помощью кода. Я читаю с веб-камеры.   -  person Dr Sokoban    schedule 21.06.2013
comment
Вместо этого было бы полезно прочитать его с изображения, чтобы другие могли воспроизвести проблему. Но что еще более важно, действительно неясно, что вы подразумеваете под артефактами, особенно на изображении S. Вы имеете в виду белую область, которая была тенью на исходном изображении? И что вы имеете в виду result picks a lot of this artifacts: вы пытаетесь сохранить артефакты или избавиться от них?   -  person David Robinson    schedule 21.06.2013


Ответы (2)


Я чувствую, что в вашем вопросе есть недоразумение. Хотя ответ Бойко Перанова, безусловно, верен, с предоставленными вами изображениями проблем нет. Логика этого такова: ваша камера делает снимки в цветовом пространстве RGB, которое по определению является кубом. Когда вы конвертируете его в цветовое пространство HSV, все пиксели сопоставляются со следующим конусом: HSV Cone

Оттенок (первый канал HSV) — это угол на конусе, Насыщенность (второй канал HSV, называемый на изображении Chroma) — это расстояние до центра конуса, а Значение (третий канал HSV) — это высота. на конусе.

Канал Hue обычно определяется между 0-360 и начинается с красного на 0 (в случае 8-битных изображений OpenCV использует диапазон 0-180, чтобы соответствовать символу без знака, как указано в документацию). Но дело в том, что два пикселя со значениями 0 и 359 действительно очень близки по цвету. Это легче увидеть, если сгладить конус HSV, взяв только внешнюю поверхность (когда насыщенность максимальна): Flattened HSV  конус

Даже если эти значения близки по восприятию (совершенно красный на 0 и красный с небольшим количеством фиолетового на 359), эти два значения далеко друг от друга. Это причина «артефактов», которые вы описываете в канале Hue. Когда OpenCV показывает его вам в оттенках серого, он сопоставляет черный цвет с 0, а белый с 359. На самом деле это очень похожие цвета, но при отображении в оттенках серого они отображаются слишком далеко друг от друга. Есть два способа обойти этот противоречивый факт: вы можете перенаправить H-канал в пространство RGB с фиксированной насыщенностью и значением, что покажет более близкое к нашему восприятию представление. Вы также можете использовать другое цветовое пространство, основанное на восприятии (например, цветовое пространство Lab), которое выиграло. не дают вам эти математические побочные эффекты.

Бойко Перанов объясняет, почему эти пятна артефактов имеют квадратную форму. Сжатие JPEG работает путем замены пикселей на более крупные квадраты, которые приблизительно соответствуют заменяемому патчу. Если вы установите очень низкое качество сжатия при создании jpg, вы увидите, что эти квадраты появляются даже на изображении RGB. Чем ниже качество, тем больше и заметнее квадраты. Среднее значение этих квадратов представляет собой единое значение, которое для оттенков красного может находиться в диапазоне от 0 до 5 (отображается черным) или от 355 до 359 (отображается белым). Это объясняет, почему «артефакты» имеют квадратную форму.

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

Аналогичная история с изменением насыщенности (нижнее левое изображение) белых пятен. Вы описываете пиксели почти черными (на кончике конуса). Следовательно, значение Saturation может сильно варьироваться, но не сильно повлияет на цвет пикселя: он всегда будет близок к черному. Это также побочный эффект цветового пространства HSV, основанного не только на восприятии.

Преобразование между RGB (или BGR для OpenCV) и HSV (теоретически) без потерь. Вы можете сами убедиться в этом: переконвертируйте ваше изображение HSV в изображение RGB, вы получите точно такое же изображение, с которого вы начали, без добавления артефактов.

person Soravux    schedule 28.01.2015

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

  • Используйте серию фотоснимков, используя Capture вместо VideoCapture или
  • Извлеките 5-10 видеокадров и усредните их.
person Boyko Perfanov    schedule 21.06.2013
comment
Я не могу найти класс Capture в OpenCV. Это из другой библиотеки? - person Dr Sokoban; 23.06.2013
comment
хай Бойко Перфанов, у меня та же проблема, но по другому сценарию. Существуют ли какие-либо методы удаления этих прямоугольных артефактов, вызванных сжатием с потерями. - person Anoop kottappuram; 29.05.2021