Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中直方图均衡化函数的说明_Matlab_Image Processing - Fatal编程技术网

MATLAB中直方图均衡化函数的说明

MATLAB中直方图均衡化函数的说明,matlab,image-processing,Matlab,Image Processing,请解释一下,当我们在MATLAB中使用histeq函数时,图像会发生什么变化?数学解释会很有帮助。直方图均衡化寻求将图像直方图展平。基本上,它将图像建模为一个概率密度函数(或者更简单地说,是一个直方图,您可以通过图像中的像素总数对每个条目进行规格化),并尝试确保像素呈现特定强度的概率是等概率的(概率相等) 直方图均衡化的前提是针对对比度差的图像。看起来太暗、太褪色或太亮的图像是应用直方图均衡化的好选择。如果绘制直方图,像素的扩展范围将限制在非常窄的范围内。通过直方图均衡化,直方图将因此变得平坦,

请解释一下,当我们在MATLAB中使用
histeq
函数时,图像会发生什么变化?数学解释会很有帮助。

直方图均衡化寻求将图像直方图展平。基本上,它将图像建模为一个概率密度函数(或者更简单地说,是一个直方图,您可以通过图像中的像素总数对每个条目进行规格化),并尝试确保像素呈现特定强度的概率是等概率的(概率相等)

直方图均衡化的前提是针对对比度差的图像。看起来太暗、太褪色或太亮的图像是应用直方图均衡化的好选择。如果绘制直方图,像素的扩展范围将限制在非常窄的范围内。通过直方图均衡化,直方图将因此变得平坦,并为您提供更好的对比度图像。这对直方图的影响是,它拉伸了直方图的动态范围

im = imread('pout.tif');
figure;
subplot(2,1,1);
imshow(im);
subplot(2,1,2);
imhist(im);
在数学定义方面,我不会让你们厌烦细节,我希望这里有一些乳胶来做,但它不受支持。因此,我请您访问此链接,该链接将对其进行更详细的解释:

但是,执行直方图均衡化得到的最后一个等式本质上是1:1映射。对于图像中的每个像素,提取其强度,然后运行此函数。然后,它将为您提供一个要放置在输出图像中的输出强度

假设
p_i
是您在图像中遇到强度
i
的像素的概率(取像素强度
i
的直方图箱数,除以图像中的像素总数)。假设图像中有
L
强度,给定
i
强度,此位置的输出强度为:

g_i = floor( (L-1) * sum_{n=0}^{i} p_i )
将像素强度0、1、2的所有概率相加,直到强度
i
。这就是众所周知的累积分布函数

MATLAB基本上使用这种方法执行直方图均衡化。然而,如果你想自己实现它,它实际上相当简单。假设您有一个输入图像
im
,它是无符号8位整数类型

function [out] = hist_eq(im, L)

if (~exist(L, 'var'))
    L = 256;
end

h = imhist(im) / numel(im);
cdf = cumsum(h);
out = (L-1)*cdf(double(im)+1);
out = uint8(out);
此函数接收假定为无符号8位整数的图像。可以选择指定输出的级别数。通常,对于8位图像,
L=256
,因此如果省略第二个参数,
L
将被假定为这样。第一行计算概率。下一行计算累积分布函数(CDF)。之后的两行使用直方图均衡化计算输入/输出,然后转换回无符号8位整数。请注意,
uint8
casting隐式地为我们执行floor操作。您需要注意,在访问CDF时,我们必须添加一个偏移量1。原因是因为MATLAB从1开始索引,而图像中的强度从0开始

MATLAB命令
histeq
的作用基本相同,只是如果调用
histeq(im)
,它假设图像中有32个强度。因此,您可以通过指定一个附加参数来覆盖
histeq
函数,该参数指定在图像中可以看到多少强度值,就像我们上面所做的那样。因此,您将执行
histeq(im,256)。在MATLAB中调用此函数,并使用我上面编写的函数,应该会得到相同的结果

作为一个练习,让我们使用一个名为
pout.tif
的图像,它是MATLAB发行版的一部分。让我们也显示它的直方图

im = imread('pout.tif');
figure;
subplot(2,1,1);
imshow(im);
subplot(2,1,2);
imhist(im);

正如您所看到的,图像的对比度很差,因为大多数强度值都在一个狭窄的范围内。直方图均衡化将使图像平坦,从而增加图像的对比度。因此,请尝试这样做:

out = histeq(im, 256); %//or you can use my function: out = hist_eq(im);
figure;
subplot(2,1,1);
imshow(out);
subplot(2,1,2);
imhist(out);
这就是我们得到的:

正如你所见,对比度更好。较暗的像素倾向于向较暗的一端移动,而较亮的像素则被推向较亮的一端。我想是成功的结果!请记住,当您尝试进行直方图均衡化时,并不是所有图像都会给您带来好的结果。图像处理主要是一个反复试验的过程,所以你需要把各种不同的技术混合在一起,直到你得到一个好的结果


希望这能让你开始。祝你好运

当然,这篇维基百科文章]()会告诉你所有你需要知道的关于直方图均衡的知识(通过MATLAB或其他任何工具)。@user3699876-那么我的答案对你有帮助吗?已经有一段时间了,我昨天看到你最后一次上网。如果你能接受,那就太好了。。。特别注意到我的答案的质量。是的,谢谢!!。一年前,我还是一名图像处理新手。我对-5的投票感到非常不安。不管怎样,我现在对Coursera课程有了很好的理解。@ Anshuman,如果一年前这个答案对你有帮助,请考虑接受答案。直方图均衡可以被修改,使它只在非空像素上工作吗?我试着制作一个直方图均衡化的代码。但结果与matlab中的内置函数不同。有什么建议吗?@Misaki除非看到你的代码和结果,否则我不能发表评论。请打开一个新问题。@rayryeng我问了一个问题,请看一看。