MATLAB中imresize函数输出图像宽度与设定值不一致的问题咨询
你的问题核心出在使用size()函数获取彩色图像尺寸的方式错误,以及对imresize()返回结果的尺寸解读有误,具体拆解如下:
1. 错误的图像尺寸获取逻辑
MATLAB中,彩色图像以三维数组存储,维度结构为[高度, 宽度, 通道数](通常是3通道RGB)。当你用[msgH, msgW] = size(msg);获取尺寸时:
- 如果
msg是彩色图,size(msg)会返回三个值:[H, W, C] - 但你只分配了两个变量,MATLAB会自动将第二个变量设置为后续所有维度的乘积,也就是
msgW = W * C
你提到原图像的msgW = 5760,这说明你的图像是3通道的,实际宽度应该是5760 / 3 = 1920,而不是5760——你误把「宽度×通道数」当成了图像的实际宽度。
2. 调整后图像的尺寸误解
当你执行rszMsg = imresize(msg, [720 1280]);时,MATLAB确实将图像调整到了720×1280×3的尺寸(高度720,宽度1280,3通道)。但你再次用[rszMsgH, rszMsgW] = size(rszMsg);获取尺寸时,rszMsgW = 1280 * 3 = 3840,这让你误以为宽度不符合预期,但实际上宽度是正确的1280,只是你把通道数的乘积算进去了。
正确的解决方案
要准确获取图像的高度和宽度,应该明确提取前两个维度,忽略通道数:
msg = imread(msgImgPath); % 正确获取彩色/灰度图的尺寸,~ 用于忽略通道数(灰度图通道数为1) [msgH, msgW, ~] = size(msg); fprintf('Height = %d and width = %d', msgH, msgW); rszMsg = imresize(msg, [720 1280]); [rszMsgH, rszMsgW, ~] = size(rszMsg); fprintf('Resized Height = %d and width = %d', rszMsgH, rszMsgW);
或者,你也可以直接用size()函数单独提取指定维度:
msgH = size(msg, 1); % 提取高度 msgW = size(msg, 2); % 提取宽度
这样就能得到准确的图像尺寸,确认imresize确实按照你指定的[720 1280]完成了尺寸调整。
补充说明:在MATLAB R2021a中,imresize(A, [m n])的行为是强制将图像拉伸到m×n的尺寸,无论原图像的宽高比如何。如果你的需求是保持原图像比例并调整到指定尺寸,可使用imresize(A, scale)或结合比例计算指定输出尺寸,但根据你的描述,当前的imresize调用逻辑是符合需求的,只是尺寸获取方式出错了。
内容的提问来源于stack exchange,提问作者Imran

