关于直方图均衡

时间:2018-03-10 21:47:51

标签: matlab image-processing

所以我想在没有histeq的情况下这样做,但是我的代码似乎得到了一个相当奇特的,真正白色的图像,而且从原始图片看起来并没有太多改进。有没有更好的方法来应用正确的直方图?

Cumlative=zeros(256,1);
CumHisty=uint8(zeros(ROWS,COLS));
% First we need to find the probabilities and the frequencies

freq = zeros(256,1);
probab = zeros(256,1);

for i=1:ROWS
    for j=1:COLS
    value=I1(i,j);
    freq(value+1)=freq(value+1)+1;
    probab(value+1)=freq(value+1)/(ROWS*COLS);
    end
end

count=0;
cumprobab=zeros(256,1);
distrib=zeros(256,1);

for i=1:size(probab)
    count=count+freq(i);
    Cumlative(i)=count;
    cumprobab(i)=Cumlative(i)/(ROWS*COLS);
    distrib(i)=round(cumprobab(i)*(ROWS*COLS));
end

for i=1:ROWS
    for j=1:COLS
        CumHisty(i,j)=distrib(I1(i,j)+1);
    end

1 个答案:

答案 0 :(得分:0)

您可能想要这样做:

freq = zeros(256,1);
for i = 1:numel(I1)
   index = I1(i) + 1;
   freq(index) = freq(index)+1;
end

count = 0;
distrib = zeros(256,1);
for i = 1:length(freq)
   count = count + freq(i);
   cumprobab = count/numel(I1);
   distrib(i) = round(cumprobab*255);
end

CumHisty = zeros(size(I1),'uint8');
for i = 1:numel(I1)
   CumHisty(i) = distrib(I1(i)+1);
end

修改

以下是没有冗余计算和简化循环的代码版本:

freq = histcounts(I1,0:256);
distrib = round(cumsum(freq)*(255/numel(I1)));
distrib = uint8(distrib);
CumHisty = distrib(I1+1);

我使用上面的线性索引,它更简单(一个循环而不是2)并自动帮助您按照它们存储的相同顺序访问像素。循环的方式(在外循环中的行和列中的内部循环)意味着您没有以最佳顺序访问像素,因为数组是按列存储的(column-major order)。按照存储在存储器中的顺序访问数据允许最佳的高速缓存使用(即更快)。

以上也可以写成:

{{1}}

这比循环代码快,但在同一数量级内。 MATLAB的最新版本不再是非常慢的循环。

我使用大小为1280x1024的图像,以40毫秒的速度编写代码,简化的循环为19.5毫秒,没有循环,为5.8毫秒。