You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

错误原因分析

  1. 彩色图像维度处理错误:imread读取的JPG彩色图像是三维数组(行×列×3),但imageFilter中用[fv, fu] = size(f)获取尺寸时,MATLAB会将三维数组的后两维合并(例如M×N×3的数组,size(f)返回[M, N*3]),导致后续提取的patch尺寸与模板wally的尺寸完全不匹配,触发维度运算错误。
  2. 输出矩阵维度错误:相似度图应为二维数组(每个像素位置对应一个相似度值),但代码中g = zeros(size(f))创建了与输入图像同维度的三维数组,不符合逻辑。
  3. 模板匹配未考虑通道:彩色图像的模板匹配需要对每个通道单独计算相似度再合并,或先转为灰度图简化处理。

修正方案

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:00:05