关于Matlab:未获得histeq()给出的平坦直方图

Not getting a flat histogram as given by histeq()

我有这段Matlab代码。请帮助我诊断问题,为什么当我们使用histeq()函数时,我没有得到均等图像的平坦直方图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
clc,clear
%Image Read
orig=imread('gun.jpg');
orig=rgb2gray(orig);
[r, c]=size(orig);

%Image Equlization using histeq()
equal_he=histeq(orig);
imhist(equal_he);  

%Manually equalizing the image using HE algorithm%%
hist_orig=imhist(orig);   %Finding histogram
pdf_hist=hist_orig/numel(orig);   %Probability density histogram
cdf_hist=cumsum(pdf_hist);   %cumulative density histogram
%Finding Equalized image
equal(find(orig(orig<256)+1)) = 235*cdf_hist(orig(orig<256)+1);
equal=uint8(reshape(equal,r,c));
figure,imhist(equal);

此代码为我提供了以下结果

手动获取的图像的直方图

Histogram

使用histeq获得的图像的直方图

Histogram

参考有关直方图均衡化的断言

> </p>
<p>参考另一篇论文</p>
<div class=


让我们假设连续随机变量X的值在区间0255内,且大小为512x512,如本文中所述,在此示例中表示为:

1
2
>> X = randi(256, 512, 512) - 1;
>> X = uint8(X);

如果我们将此随机变量显示为图像,则具有:

1
>> imshow(X)

Random

如果我们检查它的直方图,我们可以看到每个强度级别的值数量几乎相同,并且该范围内的所有值都填充有值。这样,我们可以假设图像的直方图已归一化:

1
>> figure , imhist(X, 256)

Histogram

对于这种特殊情况,我们可以说我们的随机变量X具有统一的密度。因此,p(x) = 1 / (X_max - X_min)表示对于每个强度值,发生的概率是相等的(但请注意,对于我们的示例而言,这是不正确的,考虑到每个强度水平的值之间的细微差别,无论如何,这是非常接近的)。

1
2
3
4
5
>> X_max = 255;
>> X_min = 0;
>> p = 1/(X_max + X_min)
p =
    0.0039

如果绘制每个值的累积概率总和,您会发现这非常接近:

1
2
>> figure , bar(p .* [0:255])
>> figure , bar(cumsum(imhist(X, 256)) ./ numel(X))

CDFs

现在我们知道示例案例与理想案例非常接近,让我们计算最终方程:

"很容易表明直方图均衡化的输出图像的平均亮度是中间灰度级。"

1
2
3
4
5
6
7
>> (X_min + X_max) / 2
ans =
  127.5000

>> mean(X(:))
ans =
  127.5381

如您所见,即使图像非常接近理想情况(每个像素值在理论上具有相等的概率),其值也不尽相同,而是相当接近。因此,这就是为什么方程式显示连续随机变量而不是离散变量的推导的原因。

希望这可以帮助您更好地理解问题。请务必再次阅读@rayryeng关于您的问题的很棒的评论,它们非常有帮助,可以引导您找到答案。