一、实验目的
1、熟悉及掌握图像的采样原理,实现图像的采样过程,进行图像的灰度转换。
2、理解直方图的概念及应用,实现图像直方图的显示,及通过直方图均衡和直方图规定
化方法对图像进行修正。(直方图显示,计算并绘制图像直方图,直方图均衡化)
二、实验环境
MATLAB 2016以上版本、WIN XP或WIN2000计算机
- 常用函数和调用格式
图像的增强
1、直方图
imhist函数用于数字图像的直方图计算或显示,
imhist(I, n)计算和显示图像Ⅰ的直方图,n为指定的灰度级数目,默认为256。如果I是二值图像,那么n仅有两个值。
[counts,x] = imhist(...)返回直方图数据向量counts,相应的色彩值向量x。
如: i=imread('e: \wO1.tif');
imhist(i);
2、直方图均衡化
histeq函数用于数字图像的直方图均衡化,
J= histeq(I, n)均衡化后的级数n,缺省值为64。
J= histeq(I, hgram)"直方图规定化",即将原是图象Ⅰ的直方图变换成用户指定的向量hgram(即指定另一幅图像的直方图数据向量)。
如:
i=imread('e: [wO1.tif' );
j=histeq(I,N);对图像i执行均衡化,得到具有N个灰度级的灰度图像j,N缺省值为64
3、灰度调整
imadjust函数用于数字图像的灰度或颜色调整,
j = imadjust(I)将灰度图像Ⅰ中的亮度值映射到〕中的新值并使1%的数据是在低高强度和饱和,这增加了输出图像〕的对比度值。
j= imadjust(L,[low_in; high_in],[low_out; high_out])
将图像Ⅰ中的亮度值映射到J中的新值,即将low_in 至 high_in之间的值映射到
low_out 至 high_out之间的值。low_in 以下与 high_in以上的值被剪切掉了,也就是说,low_in以下的值映射到low_out, high_in 以上的值映射到high_out。它们都可以使用空的矩阵[门,默认值是[0 1]。
如:
i=imread('e: [wO1.tif');
j=imadjust(i,[0.3,0.7],[]);将图像i转换为j,使灰度值从0.3~0.7与缺省值O~1相匹配
运算函数
1、Zeros生成全О数组或矩阵
如B = zeros(m,n) or B = zeros([m n])返回一个m*n全0矩阵2、取整函数
2、取整函数
floor最小取整函数
round四舍五入取整函数ceil最大取整函数
如a =[-1.9,-0.2,3.4,5.6,7.0,2.4+3.6i];
I=round(a)
Ⅰ =[-2 03 67 2+4i];
对一幅图像进行2倍、4倍、8倍、16倍减采样,显示结果
imageFilePath = 'E:\photo\image3.jpg'; % 读取图像
if exist(imageFilePath, 'file') == 2
% 读取图像
originalImage = imread(imageFilePath);
% 检查图像的尺寸
[height, width, ~] = size(originalImage);
fprintf('原始图像尺寸: %dx%d\n', height, width);
% 创建一个图形窗口
figure;
% 显示原始图像
subplot(2, 2, 1); % (行数, 列数, 当前位置)
imshow(originalImage);
title('原始图像');
% 2倍减采样
downsampledBy2 = imresize(originalImage, 0.5);
subplot(2, 2, 2);
imshow(downsampledBy2);
title('2倍减采样');
% 4倍减采样
downsampledBy4 = imresize(originalImage, 0.25);
subplot(2, 2, 3);
imshow(downsampledBy4);
title('4倍减采样');
% 8倍减采样
downsampledBy8 = imresize(originalImage, 0.125);
subplot(2, 2, 4);
imshow(downsampledBy8);
title('8倍减采样');
% 16倍减采样
downsampledBy16 = imresize(originalImage, 0.0625);
subplot(2, 3, 1); % 注意这里的行列配置,以便在2行3列的布局中添加第5个子图
imshow(downsampledBy16);
title('16倍减采样');
else
error('文件 %s 不存在,请确保图像文件位于当前工作目录中。', imageFilePath);
end
显示一幅灰度图像a,改变图像亮度使其整体变暗得到图像b,显示两幅图像的直方图。
imageFilePath = 'E:\photo\image3.jpg';
if exist(imageFilePath, 'file') == 2
% 读取彩色图片
colorImage = imread(imageFilePath);
% 将彩色图片转换为灰度图像
grayImage = rgb2gray(colorImage);
% 改变图像亮度,使图像变暗
darkeningFactor = 0.5; % 变暗因子
darkGrayImage = uint8(grayImage * darkeningFactor); % 使用uint8确保像素值在0到255范围内
% 创建一个图形窗口,并在一个2x2的布局中显示图像和直方图
figure;
% 显示原始灰度图像
subplot(2, 2, 1);
imshow(grayImage);
title('原始灰度图像');
% 显示变暗后的灰度图像
subplot(2, 2, 2);
imshow(darkGrayImage);
title('变暗后的灰度图像');
% 计算并显示原始灰度图像的直方图
subplot(2, 2, 3);
histObj = histogram(grayImage, 256); % 计算直方图
bins = histObj.BinEdges; % 提取bins的边界
weights = histObj.BinCounts; % 提取每个bin的计数
bar(bins(1:end-1), weights, 'FaceColor', 'b'); % 绘制直方图
title('原始灰度图像的直方图');
xlabel('灰度级别');
ylabel('频率');
% 计算并显示变暗后灰度图像的直方图
subplot(2, 2, 4);
histObjDark = histogram(darkGrayImage, 256); % 计算直方图
binsDark = histObjDark.BinEdges; % 提取bins的边界
weightsDark = histObjDark.BinCounts; % 提取每个bin的计数
bar(binsDark(1:end-1), weightsDark, 'FaceColor', 'r'); % 绘制直方图
title('变暗后灰度图像的直方图');
xlabel('灰度级别');
ylabel('频率');
else
error('文件 %s 不存在,请确保彩色图片文件位于当前工作目录中。', imageFilePath);
end
对图像b进行直方图均衡化,显示结果图像和对应直方图。
imageFilePath = 'E:\photo\image3.jpg';
if exist(imageFilePath, 'file') == 2
% 读取彩色图片
colorImage = imread(imageFilePath);
% 将彩色图片转换为灰度图像
grayImage = rgb2gray(colorImage);
% 对灰度图像进行直方图均衡化
eqImage = histeq(grayImage);
% 创建一个图形窗口,并在一个2x2的布局中显示图像和直方图
figure;
% 显示原始灰度图像
subplot(2, 2, 1);
imshow(grayImage);
title('原始灰度图像');
% 显示直方图均衡化后的图像
subplot(2, 2, 2);
imshow(eqImage);
title('直方图均衡化后的图像');
% 计算并显示原始灰度图像的直方图
subplot(2, 2, 3);
histData = histogram(grayImage(:));
bins = histData.BinEdges; % 提取bins的边界
weights = histData.BinCounts; % 提取每个bin的计数
bar(bins(1:end-1), weights, 'FaceColor', 'b'); % 绘制直方图
title('原始灰度图像的直方图');
xlabel('灰度级别');
ylabel('频率');
% 计算并显示直方图均衡化后图像的直方图
subplot(2, 2, 4);
histDataEq = histogram(eqImage(:));
binsEq = histDataEq.BinEdges; % 提取bins的边界
weightsEq = histDataEq.BinCounts; % 提取每个bin的计数
bar(binsEq(1:end-1), weightsEq, 'FaceColor', 'r'); % 绘制直方图
title('直方图均衡化后图像的直方图');
xlabel('灰度级别');
ylabel('频率');
else
error('文件 %s 不存在,请确保彩色图片文件位于当前工作目录中。', imageFilePath);
end
读入图像c,执行直方图规定化,使图像a的灰度分布与c大致相同,显示变换后图像及对应直方图。
% 读取原始图像和目标图像
originalImage = imread('E:\photo\image2.jpg');
targetImage = imread('E:\photo\image3.jpg');
% 将原始图像和目标图像转换为灰度图像
originalGray = rgb2gray(originalImage);
targetGray = rgb2gray(targetImage);
I=rgb2gray(originalImage);
J= histeq(I,64);
%均衡化成32个灰度级的直方图
[counts,x]=imhist(J);
%返回直方图图像向量counts
Q=rgb2gray(targetImage);
M=histeq(Q,counts);
%将原始图像Q的直方图变成指定向量counts
figure;
subplot(3,2,1); imshow(I); title('原始图像 1');
subplot(3,2,2); imshow(Q); title('原始图像2');
subplot(3,2,3); imhist(I);
title('原始图像1直方图');
subplot(3,2,4); imhist(Q);
title('原始图像2直方图');
subplot(3,2,5); imhist(J);
title('均衡化成32个灰度级的直方图');
subplot(3,2,6); imhist(M); title('均衡化后 的直方图');