How to make all images in a folder the same pre-determined size
4 ビュー (過去 30 日間)
古いコメントを表示
Hey I need to make 120 images the same size (800 pix (width) by 600 pix (height)). The pictures differ in ratio, so instead of stretching/skewing them, I'd like to cut equal amounts from the outer edge.
Is there a way of doing this in matlab (i.e. first compressing images to width of 800, then chopping height to 600)?
Thanks,
Isabel
2 件のコメント
Walter Roberson
2014 年 1 月 31 日
If the images differ in aspect ratios then one of them might have a height less than 600 after the width has been adjusted to 800.
回答 (3 件)
Image Analyst
2014 年 1 月 31 日
Inside the loop, figure out the size reduction factor and call imresize, then get the new size and crop if necessary. Something like this (untested):
myFolder = 'C:\Documents and Settings\yourUserName\My Documents\My Pictures';
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
for k = 1:length(jpegFiles)
baseFileName = jpegFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
imageArray = imread(fullFileName);
imshow(imageArray); % Display image.
drawnow; % Force display to update immediately.
% Get initial size
[rows, columns, numberOfColorChannels] = size(imageArray);
% Get size reduction / magnification factor
sizeFactor = 800 / columns;
% Resize
newImage = imresize(imageArray, sizeFactor);
% Get the new size.
[rows, columns, numberOfColorChannels] = size(imageArray);
% Crop if necessary
if rows > 600
% Take upper 600 lines. You could take lower or middle 600 also.
newImage = imcrop(imageArray, [1,1,columns, 600]);
newFileName = strrep(fullFileName, '.jpg', '_resized.jpg');
imwrite(newImage, newFileName );
end
end
0 件のコメント
Shivaputra Narke
2014 年 1 月 31 日
編集済み: Walter Roberson
2014 年 1 月 31 日
Hope this helps.....
contents=ls;
for i=1:length(contents)
try
tempImage=imread(contents(i,:));
tempImage=imresize(tempImage,[600,800]);
extnposn=find(contents(i,:)=='.');
extn=contents(i,extnposn+1:end);
extn(extn==' ')=[];
name=contents(i,:);
name(name==' ')=[];
imwrite(tempImage,name,extn)
catch
%write err msg as
%use msgbox
end
end
Walter Roberson
2014 年 1 月 31 日
[rows, cols, panes] = size(tempImage);
aspratio = rows ./ cols;
now if aspratio < 3/4 then you need to resize so height becomes 600 and then chop width down to 800; otherwise you need to resize so width becomes 800 and then chop height down to 600.
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!