Arrays 数组乘法中的Matlab错误?

Arrays 数组乘法中的Matlab错误?,arrays,matlab,multiplication,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 ea

我有一个简单的程序:

% 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

它给了我255,不仅是索引2,还有任何索引组合

有两件事可以解决你的问题

首先,这里是你乘法问题的原因:不同的类型
I
和so
G
属于类型
uint8
H
属于
double
类型。当您执行乘法运算时,Matlab似乎使用了最严格的类型,因此这里
uint8
。因此,
Hist(2)*G(2)
的结果属于类型
uint8
,由0到255组成

第二:请不要这样计算直方图。Matlab有许多函数(对于最常见的函数,
hist
histc
),因此请阅读文档并使用它,而不是创建自己的代码。如果您仍然想编写自己的函数(学习目的),那么这段代码太慢了。你浏览了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的人的最好建议