2014-01-13 2 views
1

У меня есть матрица с 3 каналами, и у меня есть проблема с доступом и изменением значения элементов. У меня есть этот код:opencv matrix multi channel access and fill

Mat m(4,4, CV_8UC3); 
Vec3b a; 
a[0] = 255; 
a[1] = 0; 
a[2] = 0; 
m.at<Vec3b>(0,0) = a; 

при печати матрицы м, у меня есть это:

[255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

это хорошо, но образ, который я получаю, когда я хранить матрицу с imwrite это один :

enter image description here

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

Я где-то ошибся?

ответ

0

Как уже упоминалось ранее, пиксели рядом с пикселем высокой интенсивности принимать ненулевые значения после JPG-сжатия, поскольку JPEG является алгоритмом с потерями. Фактически, сжатие JPEG сбрасывает информацию точно в области изображения с сильным градиентом.

Что касается второго вопроса: ваши пиксели голубые из-за OpenCV галтель: цветовые каналы не хранятся в R, G, порядка B, но B, G, порядок Р:

Для цвета изображения, порядок каналов, как правило, синий, зеленый, красный

Источник: http://docs.opencv.org/modules/core/doc/drawing_functions.html?highlight=green

(это одна из тех вещей, которые делают жизнь невыносимой для программиста OpenCV)

+0

Это не Quirk OpenCV, но Windows quirk. Если вы пишете свой 3-канальный буфер изображения на диск, как есть (в виде bmp или ppm), и откройте его в каком-нибудь средстве просмотра изображений, вы увидите, что он рассматривается как изображение BGR, а не изображение RGB.Для OpenCV, чтобы изображение в формате RGB означало замену пикселов изображения для каждого imread и imwrite. Во многих случаях это просто трата времени. –

+0

Итак, это причуда BMP и PPM, которая стала причудой Opencv :) Вы случайно знаете, что пиксели заменяются при сохранении/чтении JPG или PNG? –

+0

BMP и PPM - это всего лишь примеры форматов, в которых хранится буфер изображений, без сжатия. Если вы выделили 1 мегабайт памяти для своего изображения и сохранили его на жестком диске, на вашем жестком диске потребуется 1 мегабайт. Это не относится к PNG или JPEG. Эти изображения будут меньше, что означает, что они были сжаты (сжатие без потерь для PNG и сжатие с потерями для JPG). Таким образом, вопрос об обмене не имеет смысла, поскольку эти форматы не сохраняют значения пикселей, а данные, из которых эти значения могут быть восстановлены. –

3

Я не понимаю, почему это синий ... не красный?

В OpenCV формат изображения устанавливается флагом при создании изображения, например. CV_8UC3 означает 8-битные пиксели, без знака, 3 цветовых канала. В цветном изображении порядок пикселей составляет BGR, данные хранятся в порядке строк. Аналогичным образом, BGRA для CV_8UC4. Таким образом, значение, которое вы установили, является синим, а не красным, вот почему вы получили синий цвет.

У меня должен был быть только первый пиксель ...?

Причина в том, что для типов сжатых изображений, например, JPG, они не могут гарантировать точное содержание. Попробуйте установить imwrite() в не сжатый, например. BMP изображение (обычно). Вы получите изображение, как:

enter image description here

+0

Большое вам спасибо! Оно работает! Но я не понимаю, почему? Jpg плохо? – Ekica

+1

'JPG' - это тип сжатого изображения, который не всегда точно сохраняет содержимое. – herohuyongtao

+0

Спасибо за объяснение! :) – Ekica

 Смежные вопросы

  • Нет связанных вопросов^_^