中国史之【平王东迁】:
公元前771年,因镐京曾遭地震,残破不堪,又接近戎、狄等外患威胁,周平王遂在郑、秦、晋等诸侯的护卫下,将国都东迁至洛邑,东周历史由此开始。
——来源:全历史APP
【路漫漫其修远兮,吾将上下而求索】
今天介绍图像的直方图操作以及用matlab画条形图、杆图和折线图。本内容参考自《实用MATLAB图像和视频处理》第9章。
在matlab中,显示一幅图像的直方图,可以使用函数imhist。废话少说,直接看代码:
% 显示直方图
I = imread('circuit.tif');
figure, subplot(2,2,1), imshow(I), title('原图')
% 划分为256个灰度级
subplot(2,2,2), imhist(I,256), axis tight, title('直方图')
上面256个灰度级是默认的参数,就是绘制256个直方条的直方图。我们看一下绘制为64和32的效果:
% 划分为64个灰度级
subplot(2,2,3), imhist(I,64), axis tight, title('直方图64级')
% 划分为256个灰度级
subplot(2,2,4), imhist(I,32), axis tight, title('直方图32级')
可以看到,整体变稀疏了,但是分布整体还是在的。值得注意的是,使用了axis tight这个参数,表示y轴的范围来自数据的范围。
可以看到,划分为256级的时候,y轴最大为2000。划为32级的时候,y轴最大为8000。因为总的像素数不变,划分级数更少,表明每个级数所包含的像素个数增多了。
我们可以探索一下这个问题,对y轴范围进行归一化。
% 归一化
c = imhist(I, 32);
% numel(I)表示该图像的像素数,这里是280x272=76160
c_norm = c / numel(I);
figure, subplot(1,2,1);
% 定制条形图
bar_1 = bar(c);
set(gca, 'XLim', [0 32], 'YLim', [0 max(c)]); % gca是当前轴,设置轴范围
set(gca, 'XTick', [0:8:32], 'YTick', [linspace(0,7000,8) max(c)]); % 设置轴显示数据范围
set(bar_1, 'FaceColor', 'r'), title('条形图'); % 设置颜色和标题
% 显示归一化的图
subplot(1,2,2);
bar_2 = bar(c_norm);
set(gca, 'XTick', [0:8:32], 'YTick', [linspace(0,0.09,10) max(c_norm)])
xlim([0 32]), ylim([0 max(c_norm)])
title('归一化条形图')
set(bar_2, 'FaceColor', 'g')
其中, numel(I)表示该图片的像素总数,280x272=76160。归一化y轴的图片如下:
另外,我们也可以换一种显示风格,如显示杆图。
% 显示杆图
figure,
subplot(1,2,1), stem(c, 'fill', 'MarkerFaceColor', 'red'), axis tight, title('杆图')
subplot(1,2,2), stem(c_norm, 'fill', 'MarkerFaceColor', 'blue'), axis tight, title('归一化杆图')
显示折线图:
% 显示折线图
figure,
subplot(1,2,1), plot(c), axis auto, title('折线图')
subplot(1,2,2), plot(c_norm), axis auto, title('归一化折线图')
以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。
【声明】:学习笔记基于互联网上各种学习资源的个人整理。
以上是本期内容,下期介绍图像处理的直方图均衡化操作。
我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我【CV之道】一起学习。