MATLAB中'Array dimensions must match'错误排查求助
问题:匹配沃利图片时出现数组维度不匹配错误
在MATLAB R2018b中编写代码,试图通过沃利模板图在人群图中定位沃利,但反复报错Array dimensions must match for binary array op,尝试多种方法及ChatGPT排查均未解决。相关代码及报错信息如下:
主程序代码
wallyCrowd = imread('wallyCrowd.jpg'); wally = imread('wally.jpg'); figure(1); clf; subplot(1,2,1) imshow(wallyCrowd) title('Wally Multidao') xlabel('u - [pixels]') ylabel('v - [pixels]') axis on subplot(1,2,2) imshow(wally) title('wally') xlabel('u - [pixels]') ylabel('v - [pixels]') axis on similarity = imageFilter(wallyCrowd,wally,@zncc); %% rest of the code
zncc函数代码
function s = zncc(I1, I2) %% Calculate numerator and denominator I1_ = mean(I1,'all'); I2_ = mean(I2,'all'); snum = sum((I1-I1_).*(I2-I2_),'all'); sden = sqrt(sum((I1-I1_).^2, 'all') .* sum((I2- I2_).^2, 'all')); %% Return result s = snum / sden; end
imageFilter函数代码
function g = imageFilter(f, T, metric) %% Convert f and T to a double f = double(f); T = double(T); %% Initialise output % HINT: ensure it's a double g = zeros(size(f)); %% Interpret data % Hint: Store the size of f and T as useful variables [fv, fu] = size(f); [Tv, Tu] = size(T); dv = floor((Tv - 1)/2); % Use floor to ensure an integer value du = floor((Tu - 1)/2); % Use floor to ensure an integer value %% Create Padded image fp = padarray(f, [dv, du], 0, 'both'); %% Create variables which hold the relative indices v = -dv:dv; u = -du:du; %% Perform convolution if nargin == 2 metric = @(a, b) sum(a .* b, 'all'); end for i = 1:fv for j = 1:fu patch = fp(i:i+2*dv, j:j+2*du); % Ajuste aqui g(i, j) = metric(patch, T); end end end
报错信息
Array dimensions must match for binary array op. Error in zncc (line 10) snum = sum((I1-I1_).*(I2-I2_),'all'); Error in imageFilter (line 41) g(i, j) = metric(patch, T); Error in encontrar (line 34) similarity = imageFilter(wallyCrowd,wally,@zncc);
错误原因分析
- 彩色图像维度处理错误:
imread读取的JPG彩色图像是三维数组(行×列×3),但imageFilter中用[fv, fu] = size(f)获取尺寸时,MATLAB会将三维数组的后两维合并(例如M×N×3的数组,size(f)返回[M, N*3]),导致后续提取的patch尺寸与模板wally的尺寸完全不匹配,触发维度运算错误。 - 输出矩阵维度错误:相似度图应为二维数组(每个像素位置对应一个相似度值),但代码中
g = zeros(size(f))创建了与输入图像同维度的三维数组,不符合逻辑。 - 模板匹配未考虑通道:彩色图像的模板匹配需要对每个通道单独计算相似度再合并,或先转为灰度图简化处理。
修正方案
方案1:转为灰度图处理(简单高效)
先将彩色图像转为灰度图,避免维度复杂问题:
修正后主程序代码
% 读取图像并转为灰度图 wallyCrowd = rgb2gray(imread('wallyCrowd.jpg')); wally = rgb2gray(imread('wally.jpg')); figure(1); clf; subplot(1,2,1) imshow(wallyCrowd) title('Wally Multidao') xlabel('u - [pixels]') ylabel('v - [pixels]') axis on subplot(1,2,2) imshow(wally) title('wally') xlabel('u - [pixels]') ylabel('v - [pixels]') axis on similarity = imageFilter(wallyCrowd,wally,@zncc); %% rest of the code
修正后imageFilter函数
function g = imageFilter(f, T, metric) %% Convert f and T to a double f = double(f); T = double(T); %% 正确获取灰度图尺寸 [fv, fu] = size(f); [Tv, Tu] = size(T); dv = floor((Tv - 1)/2); du = floor((Tu - 1)/2); %% 创建补零后的图像 fp = padarray(f, [dv, du], 0, 'both'); %% 初始化二维相似度输出矩阵 g = zeros(fv, fu, 'double'); %% 默认匹配规则 if nargin == 2 metric = @(a, b) sum(a .* b, 'all'); end for i = 1:fv for j = 1:fu % 提取与模板尺寸一致的patch patch = fp(i:i+2*dv, j:j+2*du); g(i, j) = metric(patch, T); end end end
方案2:支持彩色图像处理
若需保留彩色信息,修改zncc函数对每个通道计算相似度后取平均:
修正后zncc函数
function s = zncc(I1, I2) % 支持彩色图像:对每个通道计算ZNCC后取平均 if ndims(I1) == 3 s = 0; channel_num = size(I1,3); for c = 1:channel_num I1_ch = I1(:,:,c); I2_ch = I2(:,:,c); I1_ = mean(I1_ch,'all'); I2_ = mean(I2_ch,'all'); snum = sum((I1_ch-I1_).*(I2_ch-I2_),'all'); sden = sqrt(sum((I1_ch-I1_).^2, 'all') .* sum((I2_ch- I2_).^2, 'all')); s = s + snum / sden; end s = s / channel_num; else % 灰度图处理逻辑 I1_ = mean(I1,'all'); I2_ = mean(I2,'all'); snum = sum((I1-I1_).*(I2-I2_),'all'); sden = sqrt(sum((I1-I1_).^2, 'all') .* sum((I2- I2_).^2, 'all')); s = snum / sden; end end
对应修正imageFilter函数(支持三维图像)
function g = imageFilter(f, T, metric) %% Convert f and T to a double f = double(f); T = double(T); %% 区分灰度图与彩色图尺寸 if ndims(f) == 3 [fv, fu, ~] = size(f); else [fv, fu] = size(f); end [Tv, Tu] = size(T); dv = floor((Tv - 1)/2); du = floor((Tu - 1)/2); %% 补零操作支持三维图像 fp = padarray(f, [dv, du, 0], 0, 'both'); %% 初始化二维相似度输出矩阵 g = zeros(fv, fu, 'double'); %% 默认匹配规则 if nargin == 2 metric = @(a, b) sum(a .* b, 'all'); end for i = 1:fv for j = 1:fu % 提取与模板尺寸一致的patch patch = fp(i:i+2*dv, j:j+2*du); g(i, j) = metric(patch, T); end end end
关键修正点
- 处理图像时明确区分灰度图(二维)与彩色图(三维),避免
size函数合并维度引发的错误。 - 相似度输出矩阵固定为二维,每个位置对应一个匹配度值。
- 彩色图像需按通道分别计算相似度后合并,确保维度匹配。
内容的提问来源于stack exchange,提问作者Davi Franke
相关产品推荐
相关产品推荐

