如何在MatLab中打开原始的YCbCr图像文件?

时间:2019-01-15 22:26:32

标签: image matlab image-processing

我正在尝试在Matlab中打开1920x1080 YCbCr原始图像文件,但是我很难让以下代码正常工作:

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

但是,当我显示图像时,它看起来并不像预期的那样。

实际图像应该是彩色的,但是我得到了奇怪的黑白图像,根本不符合预期的输出。

我还尝试将其加载到3D数组中,每个维度代表Y,Cb和Cr通道之一,但是这也产生了与前面所述类似的输出。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

忽略此位,然后在下面查看EDIT:

  

我不明白您为什么使用HttpWebRequest request = (HttpWebRequest)WebRequest.Create("****") as HttpWebRequest; request.Headers.Add("SOAPAction", ""); request.ContentType = "text/xml;charset=\"utf-8\""; request.Accept = "text/xml"; request.Method = "POST"; #region soapEnvelop string body = string.Format(@" <soapenv:Header/> <soapenv:Body> <gam:addAttach> <Username>user</Username> <MD5Password>pass</MD5Password> <did>1111</did> <myrid>2222</myrid> </gam:addAttach> </soapenv:Body>"); string postData = string.Format("<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:gam='****'>{0}</soapenv:Envelope>", body); #endregion XmlDocument soapEnvelop = new XmlDocument(); soapEnvelop.LoadXml(postData); MultipartFormDataContent form = new MultipartFormDataContent(); using (Stream stream = request.GetRequestStream()) { soapEnvelop.Save(stream); } IAsyncResult asyncResult = request.BeginGetResponse(null, null); asyncResult.AsyncWaitHandle.WaitOne(); using (WebResponse webResponse = request.EndGetResponse(asyncResult)) using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) { string soapResult = rd.ReadToEnd(); soapResult.Dump(); } ?为什么不使用fread,   这不是读图像吗?使用这个臭名昭著的original image作为测试脚本的基础,我可以显示一个imread   图片,如下面的小脚本所示。

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); 来读取它,

然后以下脚本应该起作用,

fread

要点是,在读取操作中,您还必须在乘法器中提供3个通道,因为彩色图像具有第3维,即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) 。如果您照旧只给512*600*3,那么您将没有颜色信息。同样,还需要更改重塑功能以考虑第三维。因此,512*600

    从文件中加载的
  • YCbCr版本

YCbCr version loaded from the file

答案 1 :(得分:0)

正如您所说的“任何帮助将不胜感激” ,我想我想提一下,您可以使用 ImageMagick将YCbCr原始文件转换为PNG,TIFF,JPEG或任何其他格式的文件已安装在大多数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