Matlab错误的数组乘法?

时间:2014-04-25 11:54:35

标签: arrays matlab multiplication

我有这个简单的程序:

% Read Image:
I=imread('Bureau.bmp');

% calculate Hist: 
G=  unique(I); % Calculate the different gray values
Hist= zeros(size(G)); % initialize an array with the same size as G

% For each different gray value, loop all the image, and each time you find
% a value that equals the gray value, increment the hist by 1
for j=1:numel(G) 
  for i= 1:numel (I)

     if G(j)== I(i)
         Hist(j)=Hist(j)+1;
     end

  end        
end

现在看看这个乘法:

>> G(2)

ans =

    1

>> Hist(2)

ans =

   550

>> Hist(2)*G(2)

ans =

  255

它不仅为索引2提供255,而且为任何索引组合提供255!

1 个答案:

答案 0 :(得分:3)

你的问题有两件事。

首先,这是你的乘法问题的原因:不同的类型。 I因此G属于uint8类型。 H的类型为double。当你执行乘法时,Matlab似乎使用最严格的类型,所以这里uint8。因此Hist(2)*G(2)的结果是uint8类型,包含在0到255之间。

第二:请不要以这种方式计算直方图。 Matlab有很多功能(histhistc用于最常见的功能),因此请阅读文档并使用它而不是创建自己的代码。如果你想编写自己的函数(学习目的),这段代码太慢了。你经历了大约256次图像,这是没用的。取而代之的是,一种经典的方式是:

Hist = zeros(1,256);
for i=1:numel(I)
    Hist(int32(I(i))+1) = Hist(int32(I(i))+1)+1
end

直接使用当前像素的值(+1因为索引在Matlab中从1开始)来访问直方图的相应插槽。此外,您必须将像素值强制转换为int32,以避免值为255的问题(使用uint8变量,255 + 1 = 0)。

我不想在这里迂腐,但是Matlab带有成千上万的功能(没有提到几十个工具箱)和一个写得很好的文档,所以请阅读它并使用你能找到的所有合适的内容,那就是我可以给任何开始学习Matlab的人提供最好的建议。