Как открыть необработанный файл изображения YCbCr в MatLab? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь открыть файл исходного изображения YCbCr 1920x1080 в Matlab, однако у меня возникают трудности при работе следующего кода:

fid = fopen(filePath);
image = fread(fid, 1920*1080, 'uint8=>uint8');
fclose(fid); 
image = reshape(image, 1080, 1920);

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

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

Я также пытался загрузить его в трехмерный массив, где каждое измерение представляло один из каналов Y, Cb и Cr, однако это также приводило к выводу, аналогичному описанному ранее.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как вы сказали "Любая помощь будет признательна" , я подумал, что хотел бы упомянуть, что вы можете просто конвертировать необработанный файл YCbCr в PNG, TIFF, JPEG или любой другой файл формата с помощью ImageMagick , который установлен в большинстве дистрибутивов Linux и доступен для macOS и Windows.

Запустите терминал (или командную строку, если под Windows) и преобразуйте YCbCr image.raw в PNG с помощью:

magick -size 1920x1080 -depth 8  YCbCr:image.raw  result.png

Или, скажем, файл CCIR 601 YUV в формате NetPBM PPM:

magick -size 800x600 -depth 8 YUV:image.raw result.ppm
0 голосов
/ 16 января 2019

Не обращайте внимания на этот бит и посмотрите ниже на ПРАВКА:

Я не понимаю, почему вы используете fread? Почему бы не использовать imread, что значит не для чтения изображений? Используя этот печально известный оригинал image , в качестве основы для моего тестового скрипта я мог бы отобразить YCbCr изображение, как показано в небольшом скрипте ниже.

original = imread("lenna.jpg");
% figure, imshow(original); % if you want to see how the original image looks
YCbCr_version = rgb2ycbcr(original);
% figure, imshow(YCbCr_version);  % if you want to see how the YCbCr image looks
imwrite(YCbCr_version, "out.jpg");

YCbCr_fromFile = imread("out.jpg");
figure, imshow(YCbCr_fromFile);

EDIT:

  • ЕСЛИ у вас есть бинарная версия файла, и вы можете только прочитать ее, используя fread,

тогда должен работать следующий скрипт,

clc;
clear;
close all;

original = imread("lenna.jpg");
% figure, imshow(original); % if you want to see how the original image looks
YCbCr_version = rgb2ycbcr(original);
% figure, imshow(YCbCr_version);  % if you want to see how the YCbCr image looks

fileID = fopen('out.bin','w');
fwrite(fileID, YCbCr_version, 'uint8');
fclose(fileID);

fileID = fopen('out.bin','r');
fromFile = fread(fileID, 512*600*3, 'uint8=>uint8');
fclose(fileID);
image = reshape(fromFile, 512, 600, 3);
imagesc(image)

Дело в том, что в операции чтения вы должны также указать 3 канала в умножителе, поскольку цветные изображения имеют это 3-е измерение, то есть 512*600*3. Если вы дадите 512*600, как вы делали, у вас не будет информации о цвете. Также необходимо изменить функцию изменения формы, чтобы учесть 3-е измерение. Следовательно, reshape(fromFile, 512,600, 3).

  • Версия YCbCr, загруженная из файла

YCbCr version loaded from the file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...