2

我有 100 张灰度图像(256*256 像素),它们存储在 faces.mat 文件中。所以在 faces.mat 文件中,有 100 行和 65536(256*256) 列。每行代表一个图像。

现在我想重塑面孔矩阵并显示图像。

我用:

for i=1:N    
    imagesc(reshape(faces(i,:)'),256,256));
    colormap gray;
end

但我发现我的形象转了 90 度! 在此处输入图像描述

有人可以告诉我如何将图像向右转吗?当我将它们变成 face.mat 时,我是否处理错误的图像?下面是我编写的将图像存储到矩阵的代码。

function ImageGenerate
Files = dir(strcat('D:\face\','*.tiff'));
LengthFiles = length(Files);
faces = [];
for i = 1:LengthFiles;
    Img = imread(strcat('D:\face\',Files(i).name));
    temp = im2double(Img);
    [row, col] = size(temp);
    vector = [];
    for i =1 : row
        for j = 1:col
            vector = [vector temp(i,j)];
        end
    end
    faces = [faces;vector];
end
save('faces2.mat','faces');
4

4 回答 4

5

对于具有 90 度 int 乘数的旋转图像,有以下rot90功能:

rot90(Img);

这比其他答案中提出的转置imrotate更有效,更通用。

于 2013-02-28T09:21:40.680 回答
3

您可以使用imrotate来旋转图像。要逆时针旋转 90 度,只需写

img = reshape(faces(i,:)'),256,256);
img = imrotate(img, 90);
于 2013-02-27T22:36:02.367 回答
1

对于没有图像处理工具箱的人,可以通过应用转置(翻转 X 和 Y)然后对 X 轴进行反射来实现相同的目的:

img = reshape(faces(i,:), [256 256]);
rightImg = flipdim(img', 1);

顺便说一句,我相信您可以通过更改编写面部的代码来为自己省去很多麻烦,如下所示:

temp = im2double(Img);
faces = [faces;temp(:)];

那时,您会以正确的顺序存储图像中的所有体素,并且可以使用

fre = reshape(faces,[256 256 100]);
img = fre(:,:,ii);

要理解为什么这有效,您必须意识到 Matlab 按元素的顺序将元素存储在数组中 - 所以 m(1,1), m(2,1), m(3,1), m(1,2 ), m(2,2), ... 等等。我这样做的方式保留了图像中像素的顺序,所以我最后要做的就是重塑矩阵并恢复第 i 个面。

于 2013-02-27T23:21:06.137 回答
0

由于图像表示为值矩阵,因此您可以转置矩阵,因此 imgNew=img';

例子:

  load mandrill
  X2=X';
  figure()
  image(X);
  colormap(map)
  figure()
  image(X2)
  colormap(map)

在此处输入图像描述

在此处输入图像描述

于 2013-02-28T08:29:29.323 回答