【matlab图像处理】直方图均衡化操作

中国史之【百家争鸣】:
春秋战国时期,知识分子中不同学派及各家族流派之间争芳斗艳的学术局面。这是中国思想、学术发展的黄金时期,史称“百家争鸣”。
——来源:全历史APP

【路漫漫其修远兮,吾将上下而求索】

今天介绍图像的直方图均衡化操作。本内容参考自《实用MATLAB图像和视频处理》第9章。

1、图像直方图均衡化

在matlab中,显示一幅图像的直方图,可以使用函数imhist。而对一幅图像进行直方图均衡化,可以使用函数histeq。废话少说,我们先对一张低对比度的图像进行均衡化,直接看代码:

% 显示直方图
I = imread('pout.tif');
figure, subplot(2,2,1), imshow(I), title('原图')
subplot(2,2,2), imhist(I), title('原图的直方图') 

% 使用histeq进行直方图均衡化
I_eq = histeq(I, 256);
subplot(2,2,3), imshow(I_eq), title('均衡化的图') 
subplot(2,2,4), imhist(I_eq), title('均衡化后的直方图')
从上面的视觉效果来看,对一张低对比度的图片进行直方图均衡化,可以明显改善图像的对比度。

我们再看一个例子。

% 另一个例子
% 显示直方图
I = imread('tire.tif');
figure, subplot(2,2,1), imshow(I), title('原图')
subplot(2,2,2), imhist(I), title('原图的直方图') 

% 使用histeq进行直方图均衡化
I_eq = histeq(I, 256);
subplot(2,2,3), imshow(I_eq), title('均衡化的图') 
subplot(2,2,4), imhist(I_eq), title('均衡化后的直方图')

对于这个图片,直方图的效果反而变差了。为什么呢?我们观察一下他们的直方图。分析原图的直方图,像素主要聚集在低灰度级,因为黑色橡胶占大面积,所以整体偏暗,而少部分像素偏亮,对应中间的白色金属。这样是合理的。

然而,一旦均衡化后,这种对比度被重置了,把像素右移后,导致整体图像都是偏亮,反而对比度不明显。所以,直方图均衡化并不总是取得好的效果,它是取决于原始图像的。

我们再看一个例子,探索一下均衡化为什么不起作用。

% 探索直方图均衡化的局限
% 显示直方图
I = imread('eight.tif');
figure, subplot(3,2,1), imshow(I), title('原图')
subplot(3,2,2), imhist(I), title('原图的直方图') 

% 使用histeq进行直方图均衡化
I_eq = histeq(I, 256);
subplot(3,2,3), imshow(I_eq), title('均衡化的图') 
subplot(3,2,4), imhist(I_eq), title('均衡化后的直方图') 

I_hist = imhist(I);
tf = cumsum(I_hist);
tf_norm = tf / max(tf);
subplot(3,2,5), plot(tf_norm), axis tight, title('原图归一化的函数')

[newmap, T] = histeq(I);
subplot(3,2,6), plot(T), axis tight, title('原图均衡化的函数')

上面的例子均衡化后效果也不好,我们观察两条曲线,左边是计算直方图归一化的函数,右边是内置均衡化的函数,可以看到他们非常像,所以可以知道,用于均衡化的函数仅是原始函数的cdf函数,也就是累积分布函数。均衡化的过程仅试图平坦化直方图。

2、图像直方图规定化(匹配)

对于这种情况,可以使用直方图规定化(也叫直方图匹配)技术解决,它可以不使用默认的cdf函数,而是自己指定函数。

% (4)直方图规定化(匹配)
img1 = imread('eight.tif');
figure, subplot(3,3,1), imshow(img1), title('原图')
subplot(3,3,2), imhist(img1), title('原图的直方图') 

img1_eq = histeq(img1);
subplot(3,3,4), imshow(img1_eq), title('均衡化原图')
subplot(3,3,5), imhist(img1_eq), title('均衡化后的直方图') 
m1 = ones(1, 256) * 0.5;
subplot(3,3,6), plot(m1), title('直方图曲线'), ylim([0 1]), xlim([1 256])

m2 = linspace(0,1,256); 
img2 = histeq(img1, m2);
subplot(3,3,7), imshow(img2), title('规定化后的图')
subplot(3,3,8), imhist(img2), title('规定化后的直方图') 
subplot(3,3,9), plot(m2), title('期望直方图形状'), ylim([0 1]), xlim([1 256])

从上面可以看到,执行直方图规定化需要生成一个代表期望直方图形状的函数。对于这张图片,规定化的效果比均衡化的效果要好。

以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍图像处理的邻域处理。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我【CV之道】一起学习。

  • 47
    点赞
  • 398
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
直方图均衡化是一种用于增强图像对比度的方法。对于灰度图像,可以使用histeq()函数进行直方图均衡化。对于彩色图像,可以将图像分成RGB三个通道,分别对每个通道进行直方图均衡化,然后再合成为一张彩色图像。以下是一个在Matlab中实现直方图均衡化的示例代码: ```matlab Img = imread('a1.jpg'); OutImg = Img; % 分别提取三通道的信息 R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); % 分别对三通道的图片进行直方图均衡化 R = histeq(R, 256); G = histeq(G, 256); B = histeq(B, 256); % 最后合成为一张图片 OutImg(:,:,1) = R; OutImg(:,:,2) = G; OutImg(:,:,3) = B; % 显示原始图像和均衡化后的结果 figure, subplot(1,2,1), imshow(Img); title('原始图像'); subplot(1,2,2), imshow(OutImg); title('均衡化后结果'); ``` 这段代码首先读取了一张彩色图像,然后将图像分成RGB三个通道。接下来,对每个通道的图像使用histeq()函数进行直方图均衡化。最后,将三个通道的均衡化结果合成为一张彩色图像,并显示原始图像和均衡化后的结果。 希望这个示例能够帮助到你。 #### 引用[.reference_title] - *1* *2* *3* [MATLAB--数字图像处理 图像直方图均衡化](https://blog.csdn.net/weixin_44225182/article/details/100518872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackkoLing

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值