【问题标题】:How can I read in a RAW image in MATLAB?如何在 MATLAB 中读取 RAW 图像?
【发布时间】:2014-10-29 07:13:42
【问题描述】:

我想在 MATLAB 中打开并读取 .raw 图像。我的文件可以是downloaded here。我尝试了以下三个代码 sn-ps,但都没有给出预期的结果。

代码片段 #1

    row=576;  col=768;
    fin=fopen('m-001-1.raw','r');
    I=fread(fin,row*col,'uint8=>uint8'); 
    Z=reshape(I,row,col);
    Z=Z';
    k=imshow(Z);

它显示了这张图片:

代码片段 #2

    f=fopen('m-001-1.raw');
    a=fread(f);
    input_img = reshape(a,768, 576, 3);
    input_img = imrotate(input_img, -90);
    imwrite(input_img, 'm-001-1.jpg'); 

这会以.jpg 格式保存一个空白(只是白色)图像。

代码片段#3

    id = fopen('m-001-1.raw', 'r');
    x = fread(id, [576,768], 'short');

当我使用imshow(x)时,这张图显示:

如何正确阅读这张图片?

【问题讨论】:

    标签: image matlab image-processing


    【解决方案1】:

    您的行/列大小颠倒了。由于 MATLAB 数组以列为主,而光栅图像通常以行为主,因此您需要将图像读取为 [col row] 矩阵,然后对其进行转置。

    row=576;  col=768;
    fin=fopen('m-001-1.raw','r');
    I=fread(fin, [col row],'uint8=>uint8'); 
    Z=I';
    k=imshow(Z)
    

    图像复制正在发生,因为您每行短 768-576 = 192 像素,因此每行逐渐偏离该数量。在 4 行之后,您已经弥补了差异 (4*192 = 768),因此您有一个 4 图像复制。

    【讨论】:

    • 呃。我应该看到的。彼得的好地方。
    • 谢谢你,你是对的,但数据库中的图像是彩色图像,当我运行此代码时,它会显示一个灰色图像
    • 那是因为它只用上面的代码读取第一个通道。我会写一个很快就能完成这三个方面的答案。
    • @SiminSoleymanpour - 您需要更多帮助吗?考虑接受我们的答案之一。
    • 感谢彼得的帮助。 “Stackoverflow”非常好。感谢你们在这个网站上所做的工作。我把它介绍给我认识的每个人。
    【解决方案2】:

    Peter 的代码(谢谢!)假设您的图像是灰度的。对于彩色图像,您需要做的是将所有字节作为单个 1D 数组读取,因为我们不能使用 fread 来读取作为 3D 矩阵的数据(至少据我所知不是...... )。之后,我们再对其进行整形,使其成为 3D 矩阵。在我们重塑矩阵之后,请注意这是转置的结果。因此,我们将不得不单独转置每个通道,或者您可以巧妙地结合flipdimimrotate 为我们进行 3D 转置。我会旋转图像,使其顺时针旋转 90 度,但这会使图像镜像在列上反射。然后我使用flipdim,第二个参数为2,因为我想跨列镜像反射以获取原始图像。

    因此,您实际上需要做的是:

    row=576;  col=768;
    fin=fopen('m-001-1.raw','r');
    I=fread(fin, col*row*3,'uint8=>uint8'); %// Read in as a single byte stream
    I = reshape(I, [col row 3]); %// Reshape so that it's a 3D matrix - Note that this is column major
    Ifinal = flipdim(imrotate(I, -90),2); % // The clever transpose
    imshow(Ifinal);
    fclose(fin); %// Close the file
    

    我得到的是这张图片:


    或者,您当然可以使用 Peter 的代码,但您会使用它,以便一次重建图像一个颜色平面。换句话说,您可以这样做:

    row=576;  col=768;
    fin=fopen('m-001-1.raw','r');
    I1=fread(fin, [col row],'uint8=>uint8'); %// Red channel
    I2=fread(fin, [col row],'uint8=>uint8'); %// Green channel
    I3=fread(fin, [col row],'uint8=>uint8'); %// Blue channel
    I1 = I1.'; I2 = I2.'; I3 = I3.'; %// Transpose each channel separately
    Ifinal = cat(3, I1, I2, I3); %// Create 3D matrix
    imshow(Ifinal);
    fclose(fin);
    

    您将获得与上面完全相同的图像。

    【讨论】:

    • 谢谢你的帮助,这是你第二次帮助我了。
    • 如何将其推广到 n x m 图像?也就是说,如果以前不知道尺寸。这可能吗?
    • @marcman 不,不是。这就是RAW图像的意义所在。它存储原始像素本身,没有任何标题信息。您需要事先知道有多少行和列。
    • @rayryeng:这是有道理的。我想黑客首先是size(imread(img))?另外我认为permute(img, [2,1,3]) 也适用于转置。或者 flip(permute(img, [2,1,3,]), 2) 如果需要镜像
    • @marcman 我实际上正在更改我的帖子以进行转置...这是一个旧帖子。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多