我正在尝试在Matlab中打开1920x1080 YCbCr原始图像文件,但是我很难让以下代码正常工作:
fid = fopen(filePath);
image = fread(fid, 1920*1080, 'uint8=>uint8');
fclose(fid);
image = reshape(image, 1080, 1920);
但是,当我显示图像时,它看起来并不像预期的那样。
实际图像应该是彩色的,但是我得到了奇怪的黑白图像,根本不符合预期的输出。
我还尝试将其加载到3D数组中,每个维度代表Y,Cb和Cr通道之一,但是这也产生了与前面所述类似的输出。
任何帮助将不胜感激。
答案 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
。
答案 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