使用 Octave 保存图像但在重新加载时显得模糊

Saving images using Octave but appearing fuzzy upon realoading

我参加了 Coursera 机器学习课程,学习神经网络。我从这个link得到了一些手写数字数据:http://yann.lecun.com/exdb/mnist/

现在我想将这些数据转换成.jpg格式,我正在使用这段代码。

function nx=conv(x)
nx=zeros(size(x));
for i=1:size(x,1)
    c=reshape(x(i,:),20,20);
    imwrite(c,'data.jpg','jpg')
    nx(i,:)=(imread('data.jpg'))(:)';
    delete('data.jpg');
end
end

然后,我运行上面的代码:

nx=conv(x);

x是手写数字的5000个训练样例。每个训练示例都是一个 20 x 20 像素的数字灰度图像。每个像素由一个浮点数表示,表示该位置的灰度强度。

20 x 20 像素网格 "unrolled" 变成一个 400 维向量。这些训练示例中的每一个都成为我们数据矩阵中的一行 x。这给了我们一个 5000 x 400 矩阵 x,其中每一行都是手写数字图像的训练示例。

在我 运行 这段代码之后,我将图像重写到磁盘以检查:

imwrite(nx(1,:),'check.jpg','jpg')

但是,我发现图像很模糊。如何正确转换这些图像?

您正在使用 JPEG 保存图像,这是一种用于保存图像的有损 压缩算法。有损压缩算法保证了高压缩比,但代价是稍微降低图像质量。这可能就是您看到模糊图像的原因,因为它是由压缩伪影造成的。

从表面上看,您想要确切地保存数据应该保存到文件中的内容。因此,请改用 lossless 压缩算法,例如 PNG。因此,将您保存的代码行更改为使用 PNG:

imwrite(c,'data.png','png')
nx(i,:)=(imread('data.png'))(:)';
delete('data.png');

另外:

imwrite(nx(1,:),'check.png','png')