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

数据没问题,维度转换问题,原图为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

目标直接是用MATLAB显示这个图像吗?


真彩色图像输入,指定为 m×n×3 数组数据,值应在 [0, 1] 范围内。

因此需要将输入的值归一化到[0, 1]之间。

看楼主的C++代码没有对数据进行归一化,楼主需要根据影像的位数,通常为8位图,最大值就是2的8次方减1,也就是255,因此除以255.0就可以。楼主看看这样能不能输出正确的图像。

尝试使用uint8来创建三维矩阵

你先用没被C处理过得数据还原,看看是否有问题。
如果没问题,再把c的处理过程一步一步加入,哪一步问题再去调整程序