imwrite在matlab中改变实际的图像数据

imwrite在matlab中改变实际的图像数据,matlab,Matlab,下面是使用imwrite读取和写入(复制)图像的Matlab脚本。我希望新编写的文件与原始文件相同,但图像及其直方图有所不同。脚本如下所示 %=====================================================================% I = imread('lena.jpg'); I = imnoise(I,'salt & pepper',0.05); I = im2double(I); figure, imshow(I); figur

下面是使用imwrite读取和写入(复制)图像的Matlab脚本。我希望新编写的文件与原始文件相同,但图像及其直方图有所不同。脚本如下所示

%=====================================================================%
I = imread('lena.jpg');
I = imnoise(I,'salt & pepper',0.05);
I = im2double(I);

figure, imshow(I);
figure, imhist(I);

[M,N] = size(I);
J = I;
for i = 1 : M
    for j = 1 : N
        J(i,j) = I(i,j);
    end
end
imwrite(J,'I1.png'); %tried with jpg and bmp, but same result
J = imread('I1.jpg');

figure, imhist(J); 

%=====================================================================%


请帮助我理解为什么这些图像会有所不同

我尝试运行你的Lena.jpg和Lena.png代码,用于读取输入图像和写入输出图像。 使用.jpg时,直方图是不同的。这种压缩格式是,因此预计会有一些信息丢失。如果要防止丢失,必须在使用imwrite时指定无损

imwrite(J,'I1.jpg','Mode','lossless');

使用.png时,直方图与此压缩格式相同。

imwrite(J,'I1.png');J=imread('I1.jpg')您正在阅读的图像与您所写的不同…是的,感谢您突出显示错误,但我最初使用.jpg进行写入和读取,这显示了直方图的变化。让我通过更正imread()中的扩展名来检查.png,您的意思是,如果我希望我的输出文件I1.png与lena.png相同,我最初需要从无损格式(比如lena.png)读取。我会检查它并相应地更新。无论如何,谢谢你,这是正确的。您可以尝试其他无损格式,如.tiff,您会发现直方图是相同的。无论如何,您应该使用无损格式。如果需要,您实际上可以使用.jpg,但是在使用imwrite时必须指定“无损”模式。我已使用此更改编辑了我的答案。