Я пытаюсь преобразовать коврик 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. В чем проблема и что я должен сделать, чтобы это исправить?
Я предложил объяснение в части комментариев, но решил на самом деле проверить мое предположение и объяснить немного о HSV
цветовое пространство.
Нет проблем ни в коде, ни в OpenCV cvtColor
, «блочные» артефакты существуют в RGB
изображение, но не заметно. Все алгоритмы сжатия семейства JPEG создают эти артефакты. Причина, по которой мы обычно их не видим, заключается в том, что алгоритмы «эксплуатируют» слабости нашей визуальной системы и сжимают больше вещей, к которым мы не очень чувствительны.
Я преобразовал изображение обратно в RGB
используя OpenCVs
cvtColor` и артефакты волшебным образом исчезли (изображения ниже).
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
изображение размещено в вопросеRGB
с помощью cvtColor
Я думаю, что это произошло потому, что imshow
Функция всегда будет интерпретировать изображение как простое изображение RGB или BGR. Таким образом, вам нужно изменить обратно HSV на BGR, используя cvtColor(input,input,CV_HSV2BGR)
перед показом изображения.