Блочное поведение при конвертации bgr в hsv в opencv

Я пытаюсь преобразовать коврик bgr в коврик hsv для некоторого обнаружения, но изображение hsv продолжает выходить блочным. Вот мой код на C ++:

int main() {
const int device = 1;
VideoCapture capture(device);
Mat input;
int key;
if(!capture.isOpened()) {
printf("No video recording device under device number %i found. Aborting program...\n", device);
return -1;
}
namedWindow("Isolation Test", CV_WINDOW_AUTOSIZE);
while(1) {
capture >> input;
cvtColor(input, input, CV_BGR2HSV);
imshow("Isolation Test", input);
key = static_cast<int>(waitKey(10));
if(key == 27)
break;
}
destroyWindow("Isolation Test");
return 0;
}

Вот это снимок того, как выглядит вывод. ввод не выглядит блочным, когда я закомментирую cvtColor. В чем проблема и что я должен сделать, чтобы это исправить?

2

Решение

Я предложил объяснение в части комментариев, но решил на самом деле проверить мое предположение и объяснить немного о HSV цветовое пространство.

Нет проблем ни в коде, ни в OpenCV cvtColor, «блочные» артефакты существуют в RGB изображение, но не заметно. Все алгоритмы сжатия семейства JPEG создают эти артефакты. Причина, по которой мы обычно их не видим, заключается в том, что алгоритмы «эксплуатируют» слабости нашей визуальной системы и сжимают больше вещей, к которым мы не очень чувствительны.

Я преобразовал изображение обратно в RGB используя OpenCVscvtColor` и артефакты волшебным образом исчезли (изображения ниже).

HSV В частности, цветовое пространство имеет несколько характеристик, которые преувеличивают эти артефакты. Важным из которых, вероятно, является тот факт, что везде, где V канал (значение / яркость) очень низкий, H & S каналы очень нестабильны и совершенно бессмысленны. В крайности: [128,255,0] == [0,0,0],

Очень маленькие и незаметные артефакты сжатия в темных областях изображения становятся очень заметными с ложными цветами HSV цветовое пространство.

Если вы хотите использовать HSV цветовое пространство как пространство признаков для сравнения цветов, имейте в виду, что если V очень низкий, H & S совершенно бессмысленно. Это также верно для очень низкого S значения, которые делают H значение бессмысленно ([0,0,100] == [128,0,100]).

КСТАТИ. также имейте в виду, что H канал циклический и разница между H == 0 а также H == 255 только один уровень серого.

  • Ложные цвета «блочные» HSV изображение размещено в вопросе
    Изображение HSV, опубликованное @scribeblemaniac
  • Изображение преобразовано обратно в RGB с помощью cvtColor
    То же изображение после преобразования обратно в RGB
2

Другие решения

Я думаю, что это произошло потому, что imshow Функция всегда будет интерпретировать изображение как простое изображение RGB или BGR. Таким образом, вам нужно изменить обратно HSV на BGR, используя cvtColor(input,input,CV_HSV2BGR) перед показом изображения.

0

По вопросам рекламы [email protected]