-1

假设我在 matlab 变量
中有这三个变量, 我想在 NewGrayLevels 中提取不同的值,并对与一个不同的值在同一行中的 OldHistogram 的行求和。
例如,您在 NewGrayLevels 中看到前六行等于零。这意味着 NewGrayLevels 中的 0 取自 OldGrayLevels 的 (0 1 2 3 4 5) 值。所以应该对 OldHistogram 中的相应行求和。
所以0+2+12+38+113+163=328就是均衡直方图中灰度0的频率,以此类推。
熟悉图像处理的人都知道,它是直方图均衡算法的一部分。
请注意,我不想使用图像处理工具箱中提供的内置函数“histeq”,我想自己实现它。
我知道如何用 for 循环编写算法。我正在寻找是否有更快的方法而不使用 for 循环。
使用 for 循环的代码:

   for k=0:255
       Condition = NewGrayLevels==k;
       ConditionMultiplied = Condition.*OldHistogram;
       NewHistogram(k+1,1) = sum(ConditionMultiplied);
   end  

恐怕这个代码对于高分辨率大图像会变慢。因为我上传的变量是从互联网下载的小图像,但我的代码可能用于卫星图像。

4

3 回答 3

2

我知道您说您不想使用 histeq,但可能值得您花时间查看 MATLAB 源文件,了解开发人员如何编写它并复制您想要实现的部分代码。只需编辑('histeq')或编辑('histeq.m'),我忘了哪个。

通常 MATLAB 代码在可能的情况下被矢量化并且运行得非常快。这可以使您不必重新发明整个轮子,只需重新发明您想要更改的部分。

于 2013-06-25T15:30:47.263 回答
2

我想不出在某处没有 for 循环的情况下实现这一点的方法,但是您可以进行的一种优化是使用索引而不是乘法:

for k=0:255
    Condition = NewGrayLevels==k; % These act as logical indices to OldHistogram
    NewHistogram(k+1,1) = sum(OldHistogram(Condition)); % Removes a vector multiplication,   some additions, and an index-to-double conversion
end  

编辑:

在重新阅读您的初始帖子时,我认为没有 for 循环的方法是使用 accumarray (我发现这是一个难以理解的函数,因此请阅读文档并在线搜索并在此处获取示例):

NewHistogram = accumarray(1+NewGrayLevels,OldHistogram);

只要您在 NewGrayLevels 中的最大值(+1,因为您从零开始)等于 OldHistogram 的长度,这应该可以工作。

于 2013-06-25T15:42:37.190 回答
0

好吧,我明白没有必要编写@Hugh Nolan 建议的代码。请参阅此处的说明:

%The green lines are because after writing the code, I understood that  
%there's no need to calculate the equalized histogram in  
%"HistogramEqualization" function and after gaining the equalized image  
%matrix you can pass it to the "ExtractHistogram" function  
% (which there's no loops in it) to acquire the  
%equalized histogram.    
%But I didn't delete those lines of code because I had tried a lot to  
%understand the algorithm and write them.  

有关更多信息和研究代码,请参阅我的下一个问题。

于 2013-06-26T08:32:48.527 回答