Find width and height of .jpg image

조회 수: 23 (최근 30일)
Dion Theunissen
Dion Theunissen 2022년 11월 24일
편집: DGM 2022년 11월 24일
I try to find the size of the images, resize them and sort by what kind of picture it is.
I am using the following script:
direction = strcat('/Users/simireizen/Canada Only (30) (up to date 21)/*.jpg')
srcFiles = dir(direction);
table = table;
% for i = 1 : length(srcFiles)
for i = 21
filename = strcat(srcFiles(i).folder,'/',srcFiles(i).name);
im = imread(filename);
[h,w,idk] = size(im);
table.name(i) = string(srcFiles(i).name);
table.width(i) = w;
table.height(i) = h;
table.ratio(i) = table.width(i) / table.height(i);
table.idk(i) = idk;
ratio = w/h;
name = strcat('/Users/simireizen/TestDion/Nieuw/');
if ratio < 1
k=imresize(im,[1101,826]);
newfilename=strcat(name,'verti/',srcFiles(i).name);
imwrite(k,newfilename,'jpg');
elseif ratio > 1.3 && ratio < 1.4
k=imresize(im,[900,1200]);
newfilename=strcat(name,'site/',srcFiles(i).name);
imwrite(k,newfilename,'jpg');
else
k=imresize(im,[2000,3000]);
newfilename=strcat(name,'horizontal/',srcFiles(i).name);
imwrite(k,newfilename,'jpg');
end
end
But I can not find differences between vertical en horizontal pictures.
See pictures:
Vertical:
Horizontal:
Can anyone help me?
  댓글 수: 6
Dion Theunissen
Dion Theunissen 2022년 11월 24일
unfortunately even there it says its a horizontal picture, while its really clear the document is vertical.
DGM
DGM 2022년 11월 24일
Two things to remember:
  • The reported geometry depends on the state of the Orientation tag.
  • The geometry reported by many applications is WxH instead of HxW, and they generally make no effort to clarify.
I've updated my answer. See if that helps. If not, it would help to have an example image to work from. As I mentioned, I have seen a few images with dumb tag configurations that nothing handles correctly.

댓글을 달려면 로그인하십시오.

답변 (2개)

DGM
DGM 2022년 11월 24일
편집: DGM 2022년 11월 24일
See this
That said, how do you find the aspect ratio?
A = imread('peppers.png');
[h,w,c,~] = size(A)
h = 384
w = 512
c = 3
ar = w/h
ar = 1.3333
If the image is landscape, the AR is >1. If AR<1, it's portrait. If AR = 1, then it's square. If you're reading this info from metadata alone, you may run into traps depending on how the orientation/rotation tags are set.
EDIT:
Okay, I was wrong about imread() handling orientation tags internally. I forget that I process my photos to get rid of that garbage beforehand. I'm sure there are edge cases, especially with older cameras, but you should be able to determine whether the image is landscape/portrait by using the Orientation and geometry tags.
fname = 'exif-orientation/Portrait_1.jpg';
A = imread(fname);
S = imfinfo(fname);
orient = S.Orientation;
geometry = [S.Height S.Width];
AR = geometry(2)/geometry(1);
imageislandscape = xor(orient <= 4, AR < 1)
Bear in mind that this will report a square image as portrait. You're free to handle that case if you want, but I doubt you're going to run across many snapshots taken with cameras that have square sensors.
You can try this on your own images, or you can try the full set of test images here:
Of course, if your goal is to automatically rotate/flip the image into the correct orientation, that's just a bit more work.
switch orient
case 1
% nothing to do
case 2
A = fliplr(A);
case 3
A = rot90(A,2); % or two flips
case 4
A = flipud(A);
case 5
A = rot90(A,-1);
A = fliplr(A);
case 6
A = rot90(A,-1);
case 7
A = rot90(A,1);
A = fliplr(A);
case 8
A = rot90(A,1);
end
I've attached a simple function that can read a JPG file and do this set of transformations conditionally.

Image Analyst
Image Analyst 2022년 11월 24일
I think @Rik is right. You can't just look at the rows and columns in the image array (in the most general and robust case). You may (for some images) also need to check the orientation metadata. A lot of programs look at this and present the image accordingly. For example if you have a sensor that is wider than it is tall (like all digital SLR cameras) and you turn your camera vertical to snap a "tall" image, you'd want it to look tall in your operating system (File Explorer) or other program. If you were to ignore that then you'd get a wide picture because that is the shape of the sensor. I don't believe imread() pays attention to the orientation value so if your DSLR had been turned 90 degrees, you'd still get a wide image. With a DSLR you'll always get a wide image in MATLAB regardless of what angle you held the camera at since imread, as far as I can tell, ignores the orientation value. So many porgrams look at the orientation flag and display the image to you so that the image has the orientation you took the photo with, rather than the wide/landscape orientation that is intrinsic to the sensor. If they ignored it, "vertical" pictures would look rotated 90 degrees on their side.
Of course if the image does not have an orientation flag you can just look at the number of rows and columns like you did
[h,w,idk] = size(im);
though I'd prefer to use more descriptive variable names. "idk" often means "I don't know". And height and width are built in functions so you don't want to use those either. So what I do is
[rows, columns, numberOfColorChannels] = size(im);
which is really clear and explicit.

카테고리

Help CenterFile Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by