问题遇到的现象和发生背景
我用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);
运行结果
预期结果
追加
为了排除处理过程有问题的因素,我用原图导出的数据进行了imshow,结果还是不对。或许我导出数据的方式有问题?
这是原图数据imshow的结果:
这是原图原本应该呈现的样子:
再看看我导出数据的方式:(我需要导出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