Performance 如何在matlab中实现部分直方图均衡化而不使用for循环,影响速度和性能

Performance 如何在matlab中实现部分直方图均衡化而不使用for循环,影响速度和性能,performance,matlab,image-processing,time,histogram,Performance,Matlab,Image Processing,Time,Histogram,假设我在matlab中有这三个变量 我想提取新灰度中的不同值,并将旧直方图中与一个不同值位于同一行的行相加。 例如,您可以在NewGrayLevel中看到前六行等于零。这意味着新灰度中的0已从旧灰度的(0 1 2 3 4 5)中获取其值。因此,应将OldHistogram中的相应行相加。 因此,0+2+12+38+113+163=328将是均衡直方图中灰度0的频率,依此类推。 熟悉图像处理的人都知道这是直方图均衡化算法的一部分。 请注意,我不想使用图像处理工具箱中的内置函数“histeq”,我想

假设我在matlab中有这三个变量
我想提取新灰度中的不同值,并将旧直方图中与一个不同值位于同一行的行相加。
例如,您可以在NewGrayLevel中看到前六行等于零。这意味着新灰度中的0已从旧灰度的(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  

我担心这段代码对于高分辨率的大图像来说速度会变慢。因为我上传的变量是从互联网下载的小图像,但我的代码可能用于卫星图像

我知道你说你不想使用histeq,但是你可能值得花时间看看MATLAB源文件,看看开发人员是如何编写的,并复制他们希望实现的代码部分。只要编辑('histeq')或编辑('histeq.m'),我就忘了


通常,MATLAB代码在可能的情况下是矢量化的,运行速度非常快。这可以使您不必重新发明整个车轮,而只需更换您想要更换的零件

如果没有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(我发现这是一个很难理解的函数,因此请阅读文档并在线搜索,这里有这样做的示例):


只要新灰度值的最大值(+1,因为从零开始)等于旧直方图的长度,这就应该有效。

我知道不需要编写@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.  

有关更多信息和学习代码的信息,请参见

您能否使用For循环向我们展示您的算法以指导答案?当然可以!看我的编辑手帕!我在寻找一种方法,如何看到一个特殊函数的matlab实现。是的,matlab的经验法则是,如果它是一个编译的mfile,你看不到代码(它的专有)。许多基本的MATLAB操作都是为了提高速度而编译的。您仍然可以说edit('filename'),但是那里没有任何实际的代码,只有一堆注释掉的文档。仅供参考:)亲爱的@Shaun314当我键入edit('conv2')、edit('fft')和edit('fftn')时,我只看到了m文件的文档(我指的是写在其中的注释)而不是实现。为什么会发生这种情况?原因是这些都是内置函数,我在上面的注释中写的所有内容都是您对新注释的回答。你看不到MATLAB代码,因为没有!它是用C语言编写的,不是MATLAB,它是MATLAB的“秘密”代码。听起来你可以把你最初的问题说得更清楚。好的@Shaun314函数,比如“fft2”,我们可以访问它们的代码,它们是在matlab中开发的内置函数,使用了其他基本的内置函数,比如“fft”和“fftn”,它们是使用C族语言开发的,并转换成matlab的,对吗?因此,我们可以访问matlab中一些内置函数的代码,如fft2,但不能访问基本内置函数,如fft、fftn、conv2等,对吗?也许你是对的,但首先这不是我的问题,我只是对你的回答感到好奇,谢谢你的关注正如@Shaun314所建议的,我试图阅读开发人员为“histeq”函数编写的代码。不仅是为了发现如何消除for循环,还为了理解用于在图像矩阵上应用新的均衡直方图的算法。我知道它与编辑中使用的变量映射(“histeq”)有关,但我不了解该算法。你知道该算法的任何内容吗?或者你能建议我去研究该算法吗。(这是一项大学作业,我不能使用内置函数)有关如何矢量化此代码的更多想法,请参阅编辑。至于应用转换,我不熟悉他们使用的确切转换,但这听起来像是你大学工作的一部分-你学过什么?网上有很多资源(例如)帮助理解。亲爱的@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.