我正在开发一个关于使用matlab进行模式(男/女)分类的项目。我有一个问题,我需要你的帮助。
我的程序应该找到数据集的平均图像。第一个数据集是女性,第二个数据集是男性。因此,首先意味着图像必须看起来像一个女人,第二个男人。我有不同的数据集,都具有jpeg的格式。我正在为我的程序尝试不同的数据集来检查它是否正常工作但是当我使用不同的数据集时,我无法一直看到真正的平均图像,例如:
它们是来自数据集的平均图像:
但是当我使用另一个数据集时,我的平均图像是这样的,它们没有意义,我的意思是它们看起来不像面孔:
这可能是什么原因?我应该使用不同的数据集。请帮忙。 `
filenamesA = dir(fullfile(pathfora, '*.jpg'));
Train_NumberA = numel(filenamesA);
%%%%%%%%%%%%%%%%%%%% Finding Image Vectors for A
imagesA= [];
for k = 1 : Train_NumberA
str = int2str(k);
str= strcat(str);
str = strcat('\',str,'b','.jpg');
str = strcat(pathfora,str);
imgA = imread(str);
imgA = rgb2gray(imgA);
[irowA icolA] = size(imgA);
tempA = reshape(imgA',irowA*icolA,1); % Reshaping 2D images into 1D image vectors
imagesA = [imagesA tempA]; % 'imagesA' grows after each turn
imagesA=double(imagesA);
end`
`%%%%%%%%%%%%%%%%%%%%%%%% Calculate the MEAN IMAGE VECTOR for A
mean_vectorA= mean(imagesA,2); % Computing the average vector m = (1/P)*sum(Tj's) (j = 1 : P)
mean_imageA= reshape(mean_vectorA,irowA,icolA); % Average matrix of training set A
meanimgA=mat2gray(mean_imageA);
figure(1);
imshow(rot90(meanimgA,3));`
-------------------------------------And same for dataset B (male)
答案 0 :(得分:1)
使用3D阵列或图像单元阵列,而不是将2D图像重新整形为矩阵的单行。重塑是不必要的,只能添加错误。
如果您的所有图片大小相同,则可以使用多维数组:Matlab documentation on multidimensional arrays
否则,请使用单元格数组:Matlab documentation on cell arrays
答案 1 :(得分:1)
您可以使用3D矩阵存储图像。我也清理了一下代码。未经测试。
filenamesA = dir(fullfile(pathfora, '*.jpg'));
Train_NumberA = numel(filenamesA);
imagesA = [];
for k = 1:Train_NumberA
imgA = imread(strcat(pathfora, '\', int2str(k), 'b', '.jpg'));
imgA = rgb2gray(imgA);
imagesA = cat(3, imagesA, imgA);
end
double
命令移出循环。
imagesA = double(imagesA);
计算imagesA
矩阵第3维的平均值,得到平均2D图像。
meanimage_A = mean(imagesA, 3);
转换为灰度图像。
meanimgA = mat2gray(meanimage_A);
我认为这里不需要rot90
......
figure(1);
imshow(meanimgA, 3);