【问题标题】:Calculating the MSE with a RGB and grayscale image in MATLAB - Image Processing在 MATLAB 中使用 RGB 和灰度图像计算 MSE - 图像处理
【发布时间】:2016-10-08 12:32:53
【问题描述】:

如何在 MATLAB 中使用 RGB 和灰度图像计算 MSE?我在这里写了一些代码:

I = imread('iris.jpg);
Gray = rgb2gray(I);
n = size(I);
M = n(1);
N = n(2);
MSE = sum(sum(I-Gray).^2))/(M*N);
fprintf('\nMSE:%7.2f',MSE);

但是,当我运行此代码时,我收到此错误:

错误使用 - 矩阵维度必须一致。

如何解决这个错误?

【问题讨论】:

  • 您在文件名 iris.jpg 后缺少一个右引号,并且您在以 MSE= 开头的行中有一个额外的括号

标签: image matlab image-processing matrix


【解决方案1】:

我不确定您为什么要这样做....尤其是因为灰度图像和彩色图像在颜色值方面会完全不同。

你得到的错误很清楚。灰度图像只有一个通道,而 RGB 图像有三个。您正在尝试减去尺寸不兼容的图像,因此您会收到该错误。

但是,如果此 MSE 计算确实是您想要的,您需要确保您的灰度图像具有三个颜色通道。灰度图像的红色、绿色和蓝色分量都相等,因此使用repmat 进行简单修复应该可以解决问题。我们可以使用它在多个通道上复制灰度图像以模拟彩色图像。

在计算 MSE 之前对您的 Gray 变量执行此操作:

Gray = repmat(Gray, [1 1 3]);

因此,您真的会这样做。顺便说一句,您的第一行有错字。您忘记了结束引号。您还有一个额外的右括号,用于 MSE 计算。

I = imread('iris.jpg');
Gray = rgb2gray(I);

%// Change 
Gray = repmat(Gray, [1 1 3]);

n = size(I);
M = n(1);
N = n(2);
MSE = sum(sum(I-Gray).^2)/(M*N);
fprintf('\nMSE:%7.2f',MSE);

请注意,您可能会获得较高的 MSE,因为灰度值与原始 RGB 值完全不同。

附带说明,如果您不喜欢repmat,您可以通过bsxfun 实现相同的效果,它会自动为您在多个频道上播放灰度图像:

I = imread('iris.jpg');
Gray = rgb2gray(I);

n = size(I);
M = n(1);
N = n(2);
MSE = sum(sum(bsxfun(@minus, I, Gray).^2))/(M*N); %// Change
fprintf('\nMSE:%7.2f',MSE);

【讨论】:

  • @rayren 谢谢你的回答。我是matlab的新手。是的,我想将 RGB 矩阵维度与灰度矩阵维度等同起来。函数是retmap..谢谢
  • @tara 没问题。如果我帮助了你,请考虑接受我的回答。这是通过单击我的帖子顶部左侧的向上和向下箭头下方的复选标记图标来完成的。谢谢!
【解决方案2】:

您在文件名 iris.jpg 后缺少一个右引号,并且您在以 MSE= 开头的行中有一个额外的括号

错误很明显;矩阵尺寸不一致。

您的输入图像是 RGB,它是一个 3D 矩阵 您的灰度图像是二维矩阵

您不能从 3D 矩阵中减去 2D 矩阵

【讨论】:

    【解决方案3】:
    E = imread('');
    E = imz;
    % choose your image directory
    after apply some segmentation techniques to you image
    that image save in img
    imz = double(imz(:));
    img=double(img(:));
    ima=max(img(:));
    imi=min(img(:));
    m1=std(img(:));
     s1=20*log10((ima-imi)./m1);
     A = E.*E;
    B = bgm.*bgm;
    l2rat = sqrt(sum(B(:))/ sum(A(:)));
    absd = abs(bgm);
    AS = absd.^2;
    maxerr = round(max(AS(:)));
    % Measure Peak SNR
    [peaksnr1, snr] = psnr(E, bgm);
    fprintf('\n The Peak-SNR value is %0.4f', peaksnr1);
    fprintf('\n The SNR value is %0.4f \n', s1);
    fprintf('\n The MSE value is %0.4f \n', m1);
    fprintf('\n The L2rat value is %0.4f \n', l2rat);
    fprintf('\n The maxerr value is %0.4f \n', maxerr);**
    

    【讨论】:

    • 请不要发布纯代码答案。在代码中添加一些解释或 cmets 以明确您在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多