weixin_43516418 2022-05-01 22:07 采纳率: 100%
浏览 144
已结题

matlab把RGB三个通道的数据导入矩阵之后imshow的图像不对,是哪里有问题?

问题遇到的现象和发生背景

我用matlab提取了图像R、G、B三个通道的数值存入txt文件中,然后用c语言对txt的数值进行了处理,输出为三个txt文件,里面分别都有720*1280个数据,然后用matlab把txt文件中的数据分别存到三维数组m的R、G、B通道中,最后对m进行imshow,但显示的结果跟预期图像没一点关系

问题相关代码
%此为matlab代码
close all;

delimiterIn = ' ';   %分隔符为空格
%R通道
filename = 'sunset_r_pro.txt';
R = importdata(filename,delimiterIn);   %导入R通道数据到矩阵R中
%G通道
filename = 'sunset_g_pro.txt';
G = importdata(filename,delimiterIn);   %导入G通道数据到矩阵G中
%B通道
filename = 'sunset_b_pro.txt';
B = importdata(filename,delimiterIn);   %导入B通道数据到矩阵B中

m(:,:,1)=R;
m(:,:,2)=G;
m(:,:,3)=B;

imshow(m);
运行结果

img

预期结果

img

追加

为了排除处理过程有问题的因素,我用原图导出的数据进行了imshow,结果还是不对。或许我导出数据的方式有问题?
这是原图数据imshow的结果:

img

这是原图原本应该呈现的样子:

img

再看看我导出数据的方式:(我需要导出double类型的数据,才方便进行处理)
1、用matlab导出到txt中(一维)

%此为matlab代码

X = imread( 'sunset.jpg' );
X = im2double(X);
data = [X(:,:,1);X(:,:,2);X(:,:,3)];

%打开要写入的txt
fid = fopen('sunset_rgb.txt','wt'); 
fprintf(fid,'%f ',data);
fclose(fid);

2、用c将txt中数据导入到数组img中,再输出为720*1280的txt文件

#include <stdio.h>

#define imgW 1280
#define imgH 720

double img[imgH * imgW];

int len = imgW * imgH;

void main(int argc, char* argv[])
{
    //输入 
    int i;
    int j;
    FILE* fp;
    if((fp = fopen("sunset_r.txt", "r"))==NULL)
    {
        printf("can not open data file.\n");  //打开文件失败 
        exit(0);
    }
    for (i = 0; i < len; ++i)
    {
        fscanf(fp,"%lf",&img[i]);   //读取文件内容到数组img内 
    }
    fclose(fp);
    
    //不进行任何处理 
    
    //输出
    char* fileName1="sunset_r_ori.txt";
    FILE* fp1 = fopen(fileName1, "w+");
    for (i = 0; i < imgH; ++i)
    {
        for(j=0;j < (imgW-1);j++)
        {
            fprintf(fp1, "%lf ", img[i * imgW + j]);     //输出到目标文件 
        }
        fprintf(fp1, "%lf\n ", img[(i+1) * imgW - 1]);
    }
    fclose(fp1);
} 

3、最后再用matlab,用此问题开头部分的代码进行imshow

  • 写回答

4条回答 默认 最新

  • mozun2020 2022-05-04 15:20
    关注

    数据没问题,维度转换问题,原图为MxN的长宽,保存为txt文件的颜色通道数据,在被读取出来的时候,被强制转换为1行MxN列数据,所以直接读取显示的就成了1x(MxN)x3维的数据,所以不能显示原图

    代码如下,可以参考

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %功能:图像数据保存与读取
    %环境:Win7,Matlab2015b
    %Modi: C.S
    %时间:2022-05-04
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    close all;
    clear all 
    clc
    
    tic
    %1,保存数据
    X = imread( 'sunset1.jpg' );
    X = im2double(X);
    [m,n,d] = size(X);
    data_r = X(:,:,1);
    fid_r = fopen('sunset_r_pro.txt','wt'); 
    fprintf(fid_r,'%f ',data_r);
    fclose(fid_r);
    
    data_g = X(:,:,2);
    fid_g = fopen('sunset_g_pro.txt','wt'); 
    fprintf(fid_g,'%f ',data_g);
    fclose(fid_g);
    
    data_b = X(:,:,3);
    fid_b = fopen('sunset_b_pro.txt','wt'); 
    fprintf(fid_b,'%f ',data_b);
    fclose(fid_b);
    
    %2,读取数据
    delimiterIn = ' ';   %分隔符为空格
    %R通道
    filename1 = 'sunset_r_pro.txt';
    R = importdata(filename1,delimiterIn);   %导入R通道数据到矩阵R中
    %G通道
    filename2 = 'sunset_g_pro.txt';
    G = importdata(filename2,delimiterIn);   %导入G通道数据到矩阵G中
    %B通道
    filename3 = 'sunset_b_pro.txt';
    B = importdata(filename3,delimiterIn);   %导入B通道数据到矩阵B中
     
    %3,维度转换
    R = reshape(R,m,n);
    G = reshape(G,m,n);
    B = reshape(B,m,n);
    
    dst(:,:,1)=R;
    dst(:,:,2)=G;
    dst(:,:,3)=B;
     
    figure(1);imshow(X);title('原图');
    figure(2);imshow(dst);title('读取图');
    toc
    

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 修改了问题 5月3日
  • 修改了问题 5月2日
  • 展开全部

悬赏问题

  • ¥15 如何删除这个虚拟音频
  • ¥50 hyper默认的default switch
  • ¥15 网站打不开,提示502 Bad Gateway
  • ¥20 基于MATLAB的绝热压缩空气储能系统代码咨询
  • ¥15 R语言建立随机森林模型出现的问题
  • ¥20 unity内置语言切换的按钮设置
  • ¥15 中级微观经济学,生产可能性边界问题
  • ¥15 TCP传输时不同网卡传输用时差异过大
  • ¥15 请各位看看我写的属于什么算法,或者有更正确的写法?
  • ¥15 html5 qrcode 扫描器