假设我在matlab Variables中有这三个变量
我想在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
我担心这段代码对于高分辨率大图像来说速度慢。因为我上传的变量是从互联网上下载的小图像,但我的代码可能用于sattellite图像。
答案 0 :(得分:2)
我知道你说你不想使用histeq,但是看看MATLAB源代码文件以了解开发人员如何编写它并复制你想要实现的代码部分可能是值得的。 。只需编辑('histeq')或编辑('histeq.m'),我忘记了哪一个。
通常,MATLAB代码在可能的情况下进行矢量化并且运行得非常快。这可以使您不必重新发明整个车轮,只需要重新发明您需要更改的部件。
答案 1 :(得分: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的长度,这应该可以工作。
答案 2 :(得分: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.
有关详细信息和学习代码,请参阅my next question.