未得到histeq()

时间:2016-01-22 16:38:34

标签: matlab image-processing histogram

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

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 of image obtained manually

使用histeq

获得的图像直方图

Histogram of image obtained using histeq

输入图像

Input Image used for equalization

关于直方图均衡的断言的引用

Reference to another paper

1 个答案:

答案 0 :(得分:2)

让我们假设一个连续的随机变量X,其值在0255区间以及大小512x512之内,如本文所述,代表在这个例子中:

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

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

>> imshow(X)

Random variable X

如果我们检查它的直方图,我们可以看到每个强度等级的值几乎相同,并且该范围内的所有值都用值填充。这样我们就可以假设我们的图像的直方图已经标准化了:

>> figure , imhist(X, 256)

Histogram

对于这种特殊情况,我们可以说我们的随机变量X具有统一的密度。所以,p(x) = 1 / (X_max - X_min)意味着对于每个强度值,发生的概率是相等的(但请注意,对于我们的例子,这不是真的,考虑到每个强度等级的值的数量之间的微小差异,无论如何,它&#39} ;非常接近)。

>> X_max = 255;
>> X_min = 0;
>> p = 1/(X_max + X_min)
p =
    0.0039

如果您绘制每个值的概率的累积和,您可以看到这非常接近:

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

CDFs

现在我们知道我们的示例案例非常接近理想情况,让我们计算最终的等式:

&#34;很容易证明直方图均衡的输出图像的平均亮度是中间灰度级。&#34;

>> (X_min + X_max) / 2
ans =
  127.5000

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

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

希望这有助于您更好地理解您的问题。请务必再次阅读@rayryeng关于您的问题的精彩评论,他们非常有帮助,可以引导您回答。