一:绘制图像直方图函数,定义为myDrawHistogram.m
myDrawHistogram.m代码如下:
function y = myDrawHistogram(x) %函数以function关键字开头,函数名作为文件名
x = double(x);p = x(:); %将输入图像x转化为double数据类型,将列排列成一个列向量
%% 两个%%代表分隔线
y = hist(p,256);hist(p,256); %即将图像的直方图保存在y中,并绘制直方图
pm = myMax(y); //
k = ceil((pm+50)/200);
tk = 200;
if k>10
tk = 400;k = ceil(k/2)*2;
end
%% 设置直方图的坐标和样式
xlabel('piexl value');ylabel('frequency');
axis([0 256 0 k*200]);
set(gca,'xtick',0:50:256,'ytick',0:tk:k*200);
set(gca,'fontsize',12,'fontname','times new roman','tickdir','out');
set(gcf,'position',[400 100 300 200],'color','w');
%%
function mm = myMax(v) %代表myDrawHisteogram的内调函数
mm = max(v);
end
end
因为是我们写的调用函数,在没有参数是运行出现以下信息是正常的,这是只要在编写一个程序调用这个函数就可以了;
二:绘制图像直方图程序
pc001.m的代码如下:
clear;clc;close all;
%clear代表清空工作区的变量;
%clc代表清空命令窗口显示的命令
%close all代表关闭图形输出窗口
% 代表依次读入图像,不在同一目录下可以用绝对路径
p1 = imread("D:\matlab\image\Lena.tif");
p2 = imread("D:\matlab\image\Baboon .tif");
p3 = imread("D:\matlab\image\Peppers.tif");
%调用函数一次输出图像的直方图,并加上标题
figure(1);myDrawHistogram(p1);title("lena");
figure(2);myDrawHistogram(p2);title("Baboon");
figure(3);myDrawHistogram(p3);title("Peppers");
三:得到图像
图像一:Lena
图像二:Baboon
图像三:Peppers
四:总结
通过以上的图像可以发现直方图图像具有明显的波动特征,所以,要从图像的直方图图像恢复成原始图像是很难的,且当图像呈现均匀分布时,恢复图像几乎不可能。