OpenCV против Matlab: разные значения в пикселях с imread

Я столкнулся с проблемой с функцией imread() в Matlab (2014) и OpenCV (3.0) в Windows 7 с файлами jpg.

У меня нет одинаковых значений при чтении одного и того же файла jpg и одного и того же пикселя.

Вот мои 2 кода: (код OpenCV, за которым следует код Matlab) и значения, которые у меня есть (режим отладки для просмотра в OpenCV, клавиатура в Matlab)

#include <opencv2\opencv.hpp>
#include <cstdio>

using namespace cv;
using namespace std;

int main()
{
     Mat img = imread("test.jpg");

     uchar pb = img.at<Vec3b>(0, 0).val[0];
     uchar pg = img.at<Vec3b>(0, 0).val[1];
     uchar pr = img.at<Vec3b>(0, 0).val[2];

     int d = img.depth();

     int t = img.type();
}

Ценности :

     pixel [0,0] = (147,174,204); // = index(1,1) in the image.
     d = 0;
     t = 16;

Код Матлаб:

img = imread('test.jpg');

img(1,1,:)

whos img

Ценности :

ans(:,:,1) =
148

ans(:,:,2) =
174

ans(:,:,3) =
201

Name         Size                   Bytes  Class    Attributes
img       1920x2560x3            14745600  uint8     

Вы хоть понимаете, почему значения разные?

Я видел в другом посте подобную проблему, но у человека не было такой же глубины, читая размолвку. Здесь, как видите, у меня такая же глубина!

Заранее спасибо и извините за любую английскую ошибку.

PS: я тестировал и другие пиксели, те же результаты: закрытые результаты, но не совсем равные.


person Nablast    schedule 24.07.2015    source источник
comment
Можете ли вы предоставить рассматриваемый файл JPEG для дальнейшего изучения?   -  person ypnos    schedule 24.07.2015
comment
также опубликуйте весь код openCV, где вы сохраните изображение.   -  person Ander Biguri    schedule 24.07.2015
comment
код Matlab и приложение C++ находятся в одном каталоге? Вы уверены, что оба файла идентичны? например вы не открыли + не сохранили изображение в другом месте (возможно, вводя дополнительные эффекты сжатия jpeg)?   -  person Micka    schedule 24.07.2015
comment
Привет ! Спасибо за ваши ответы и извините за задержку моего ответа! @ypnos Я потерял свой первый пример, но нашел другой, вы можете проверить код, который я написал выше, с помощью этой картинки ссылка, попробуйте с пикселем (86,86) в Matlab (и так (85,85) в openCV. Я нахожу (92,104,118) в openCV, (91,105,118 ) в Матлабе.   -  person Nablast    schedule 27.07.2015
comment
@AnderBiguri Я не сохраняю изображение. Вот вам весь код для моего теста. Я проверяю значения openCV с помощью отладки в Visual Studio 2013, но если я добавлю cout для просмотра значений в консоли, это то же самое.   -  person Nablast    schedule 27.07.2015
comment
@Micka Я пробовал поместить .m matlab в тот же каталог, с тем же файлом, но с теми же результатами.   -  person Nablast    schedule 27.07.2015
comment
Происходит что-то странное. Если вы понимаете, прочитанные типы изображений отличаются. Какому типу данных соответствует img.type()==16?   -  person Ander Biguri    schedule 27.07.2015
comment
@Nablast Я получаю [90 ,106 ,122] в Matlab для пикселя (86,86). Может быть, это не проблема openCV.   -  person Ander Biguri    schedule 28.07.2015
comment
@AnderBiguri Я исправил проблему. Это исходит из версии 8 libjpeg, используемой из версии 2.4.11 openCV. Скомпилировав openCV 3.0 с libjpeg 6b, я получил хорошие результаты (кстати, такие же по сравнению с Matlab 2014).   -  person Nablast    schedule 20.08.2015
comment
Блестящий. Отредактируйте эту информацию где-нибудь. Я читал немного после этого. Отличия абсолютно нормальные. В jpg нет стандарта для кодирования, поэтому разные кодировки дают разные значения, и все они в порядке. в основном, если вы не хотите изменять значения пикселей, сохраните его в формате без потерь, например png.   -  person Ander Biguri    schedule 20.08.2015


Ответы (2)


Для людей, которые будут читать эту тему, это окончательное объяснение:

Это происходит из версии libjpeg. Версия 6b (OpenCV использовала ее до 2.4.11) работает так же, как Matlab 2014b. Из версии 8 libjpeg у меня были другие результаты, о которых я упоминал выше.

Чтобы решить мою проблему (я использовал некоторую разницу изображения и фона для создания маски, и моя проблема заключалась в том, что у меня было немного снега на изображении с OpenCV (без libjeg версии 6b), я скомпилировал OpenCV 3.0 с libjpeg 6b. (у меня также был импортировать 2 библиотеки времени выполнения и поместить их в свой проект, свободно найденный в Интернете).

Я не сообщал об ошибке в OpenCV. Честно говоря, у меня не получилось, я не понял, как это сделать на их сайте, даже пытался...

person Nablast    schedule 20.08.2015
comment
У меня точно такая же проблема, но ваше объяснение немного непонятно. Например, нужно ли мне создавать маску, если да, то как? Не могли бы вы объяснить немного подробнее? - person smttsp; 14.09.2015
comment
Нет, я говорил о маске, потому что она была в моем приложении. Связи с проблемой нет. С openCV 2.4.11 и 3.0 у вас не будет таких же результатов с Matlab из-за библиотеки, которую использует openCV. Если вы хотите получить те же результаты (прочитав изображение в формате jpeg), что и Matlab, вы можете использовать openCV 2.4.10 и ранее или попытаться скомпилировать openCV 2.4.11 (или 3.0) с libjpeg 6b вместо 8, который используется по умолчанию . Я не знаю, какая версия лучше, но я думаю, что это 6b, потому что мои результаты с моим приложением были лучше. - person Nablast; 15.09.2015

Этот код дает правильные значения для вашего примера изображения test2.jpg:

#include <opencv2/highgui/highgui.hpp>
#include <iostream>

int main()
{
    auto img = cv::imread("test2.jpg");
    auto pixel = img.at<cv::Vec3b>(85, 85);
    std::cout << (int)pixel[0] << "\t" << (int)pixel[1]
              << "\t" << (int)pixel[2] << std::endl;
}

Вывод:

118     105     91

Версия OpenCV здесь 2.4.10. Я получаю тот же результат при использовании вашего кода. Я полагаю, что где-то есть ошибка, на которую вы не можете повлиять.

person ypnos    schedule 27.07.2015
comment
Большое спасибо ! Я скопировал ваш код, и действительно, у меня не те же результаты... Я только что скачал openCV 2.4.10 и получил хорошие значения. Так что можно сказать, что проблема исходит от версии 3.0. - person Nablast; 28.07.2015
comment
В OpenCV 2.4.11 я получаю [118, 104, 92] в (85,85). Можете ли вы также поделиться, какую платформу вы используете? У меня Mac OS X Yosemite — 10.10.4. Я подозреваю, что это не просто версия... она также может зависеть от платформы. - person rayryeng; 28.07.2015
comment
@rayryend Я пробовал с openCV 2.4.10 (и у меня такое же значение: 118, 105, 91), но не с 2.4.11! В Visual Studio 2013 и MSI GP70 (Windows 7)! - person Nablast; 28.07.2015
comment
Вы должны отправить отчет об ошибке в проект OpenCV. - person ypnos; 29.07.2015
comment
Хм статут отменили, но ответ человека менявшего статут не дает ответа на то что на 2.4.10 версии работает хорошо а на поздних нет.. - person Nablast; 29.07.2015
comment
Да, а также декодирование JPEG является детерминированным процессом. Причина закрытия бага - бред. - person ypnos; 29.07.2015