所以我想在没有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
答案 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毫秒。