一、实验目的
1.了解和掌握图像增强的方法。
2.掌握MATLAB中的图像的代数和几何运算函数的使用方法。
3.掌握MATLAB中的图像的增强函数的使用方法。
4.掌握MATLAB中的图像的滤波函数的使用方法。
5.用MATLAB函数和编程实现图像的几何变换、灰度变换和直方图变换,分析和比较不同系数、不同函数情况下的图像增强效果。
二、实验要求
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
三、实验内容(每一个内容编写一个*.m文件)
1.将索引图像‘woman.mat’调整大小。
(1)增大3倍;
(2)减少1/2;
(3) 调整大小为〔20 80〕。
要求分别用3种不同的插补方法。
代码;
clc,
clear
load woman.mat;
figure;
imshow(X,map); %显示带有颜色图 map 的索引图像 X。
figure;
X1 = imresize(X,3,'bilinear'); % 调用格式: I = imresize(A,M,method),method的几种可选值,neareat(默认值)最邻近插值,bilinear,双线性插值,bicubic,双三次插值
imshow(X1,map)
title('双线性插补法')
figure;
X2 = imresize(X,0.5,'nearest');
imshow(X2,map)
title('最近邻法插补')
figure;
X3 = imresize(X,[20,80],'bicubic');
imshow(X3,map)
title('双立方插补')
结果:
clc,
clear
load woman.mat;
subplot(2,3,1)
imshow(X,map);
title("原图像")
subplot(2,3,2)
I = imrotate(X,-30,'bilinear');
imshow(I,map);
title("顺时针旋转30°");
subplot(2,3,3)
I1 = imrotate(X,60,'bicubic');
imshow(I1,map);
title("逆时针旋转60°")
subplot(2,3,4)
I2 = imrotate(X,90,'nearest');
imshow(I2,map);
title("逆时针旋转90°")
subplot(2,3,5)
I3 = imrotate(X,60,'crop');
imshow(I3,map);
title("用参数‘crop’逆时针旋转60°")
3.将索引图像chess.mat进行剪切 。
(1)交互式剪切,剪切象棋马头部分;
(2)非交互式剪切,剪切范围为[30 60 40 100]。
代码;
clc,
clear
load chess
figure;
imshow(X,map);
title('原图像')
imcrop;
figure;
X2 = imcrop(X,map,[30 60 40 100]);
imshow(X2,map);
title('原图剪切块(30 60 40 100)')
4.利用Maltlab直接灰度变换法的函数对图像medicine_pic.jpg进行灰度变换:
(1)使用函数imadjust(参数gamma分别取0.4,1和2时)在一个figure图像窗口中显示输入图像(medicine_pic.jpg);体会gammar参数取不同值时的使用效果并用文字说明;
(2)使用函数imadjust得到输入图像(medicine_pic.jpg)的负片图像。
代码;
clc,
clear
I = imread("C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\medicine_pic.jpg");
subplot(2,2,1);
imshow(I)
subplot(2,2,2);
I1 = imadjust(I,[],[],0.4);
imshow(I1)
subplot(2,2,3);
I2 = imadjust(I,[],[],1);
imshow(I2)
subplot(2,2,4);
I3 = imadjust(I,[],[],2);
imshow(I3)
g0 = imadjust(I,[0,1],[1,0],1);
figure,imshow(g0);title('负片图像');
g = imcomplement(I); % 效果同上
figure,imshow(g);title('等效的负片图像');
5.根据灰度变换原理编写MATLAB代码,对图像实现如下灰度变换:
(1)对输入图像(pollen.jpg)实现线性变换,pollen = pollen×A+B,其中,及,观察两种情况下图像灰度变换并分析,选择一个合适的变换参数,使得图像质量得到提高,并分析原因;
(2)对输入图像(point.jpg)进行对数变换,point = log(1 + point),并分析变换前后图像的变化和数据的变化;
(3)对输入图像(point.jpg)进行幂指数变换,point = point ^0.2,并分析变换前后图像的变化和数据的变化。
代码;
original = imread("C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\pollen.jpg");
transformed1 = LinearTransformFunc(original, 0.5, 50);
subplot(1,2,1)
imshow(transformed1)
transformed2 = LinearTransformFunc(original, 1.5, 50);
subplot(1,2,2)
imshow(transformed2)
function [ new ] = LinearTransformFunc( original, k, d )
new = original * k + d;
end
I1 = imread("C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\point.jpg");
I2 = im2uint8(mat2gray(log(1 + double(I1))));
subplot(1,2,1)
imshow(I1)
subplot(1,2,2)
imshow(I2)
I1 = imread("C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\point.jpg");
I2 = im2uint8(mat2gray(double(I1))^0.2);
subplot(1,2,1)
imshow(I1)
subplot(1,2,2)
imshow(I2)
clear
clc
I = imread("C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\pollen.jpg");
figure;
imshow(I);
figure;
imhist(I,25); %25的意思是绘制25个直方条的直方图
axis([0 255 0 300000]) %%设置坐标轴
set(gca,'xtick',0:30:255)
set(gca,'ytick',0:50000:300000)
title('使用函数imhist绘制图像直方图')
figure;
h = imhist(I,25);
horz=linspace(0,255,25);
bar(horz,h,0.3);
axis([0 255 0 300000]) %%设置坐标轴
set(gca,'xtick',0:20:255)
set(gca,'ytick',0:40000:300000)
title('使用函数bar绘制图像直方图')
figure;
stem(horz,h,'fill')
axis([0 255 0 300000]) %%设置坐标轴
set(gca,'xtick',0:30:255)
title('使用函数stem绘制图像直方图')
figure;
plot(h);
title('使用函数plot绘制图像直方图')
7.利用Maltlab中的图像增强函数,对一给定灰度图像‘cameraman.tif’进行增强处理,要求依次进行以下操作:添加椒盐噪声、中值滤波、图像增亮、增加对比度、直方图均衡化 ,得到增强后的图像,要求每次处理后显示图像的直方图,并分析比较直方图。
代码;
clc,
clear
I = imread('cameraman.tif');
subplot(3,3,1);
J1 = imnoise(I,'salt & pepper'); %椒盐噪声
imshow(J1);
title("椒盐噪声")
subplot(3,3,2);
imhist(J1);
subplot(3,3,3);
J2 = medfilt2(J1); %添加中值滤波
imshow(J2);
title("添加中值滤波")
subplot(3,3,4);
imhist(J2);
subplot(3,3,5)
J3 = imadjust(I,[],[0.5 1]); %灰度变换
imshow(J3);
title("灰度变换")
subplot(3,3,6)
imhist(J3);
subplot(3,3,7)
J4 = imadjust(J3,[0.35 0.55],[]); %图像增亮
imshow(J4);
title("图像增亮")
subplot(3,3,8)
imhist(J4);
subplot(3,3,9)
J5 = histeq(J4); % 直方图均衡化
imshow(J5);
title("直方图均衡化")
8.利用Maltlab中的图像增强函数,对一给定灰度图像‘eight.tif’进行局部增强处理,要求依次进行以下操作:灰度求反、图像变暗、降低对比度,得到增强图像1,对增强图像1选择明暗交界处的一部分进行滤波,得到局部增强图像2。
代码;
clear;
I=imread('C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\eight.tif');
figure,
subplot(2,2,1);
imshow(I)
subplot(2,2,2);
J1=imadjust(I,[0 1],[1 0]); %灰度反转
imshow(J1)
title(" 灰度反转")
subplot(2,2,3);
J2=imadjust(J1,[],[0 0.8]); %图像变暗
imshow(J2)
title(" 图像变暗")
subplot(2,2,4);
J3=imadjust(J2,[],[0.3 0.7]);%降低对比度
imshow(J3)
title("降低对比度")
figure,
J4=roipoly(J3); %roipoly函数选择感兴趣的多边形区域。
subplot(1,2,1);
imshow(J4)
J5=fspecial('average',9); %fspecial 创建预定义的二维过滤器
J6=roifilt2(J5,J3,J4);
subplot(1,2,2);
imshow(J6)
9.根据直方图均衡原理编写MATLAB代码,对图像pollen.jpg实现直方图均衡化处理,与直接使用函数histeq()的结果进行比较并做出文字说明。
代码;
clear all,
close all,
clc,
fx = imread('C:\Users\25023\Desktop\图像识别文件\实验二用到的图像\pollen.jpg');
subplot(3,2,1);imshow(fx);
[R, C] = size(fx);
count = zeros(1, 256);
for i = 1 : R
for j = 1 : C
count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1;
end
end
T = zeros(1, 256);
T = double(T); count = double(count);
for i = 1 : 256
T(1, i) = count(1, i) / (R * C);
end
for i = 2 : 256
T(1, i) = T(1, i - 1) + T(1, i);
end
for i = 1 : 256
T(1, i) = T(1, i) * 255;
end
fy = double(fx);
for i = 1 : R
for j = 1 : C
fy(i, j) = T(1, fy(i, j) + 1);
end
end
fy = uint8(fy);
subplot(3,2,3);imshow(fy);
subplot(3,2,4);imhist(fy);
I=histeq(fx);
subplot(3,2,5);imshow(I);
subplot(3,2,6);imhist(I);
四、问题与讨论
1.图像灰度变换有哪些类型?
1.负片
2.扩展区间与伽马灰度变换
3.自动选取灰度级的灰度变换
4.对数变换
5.直方图均衡化
2.直方图是什么概念?它反映了图像的什么信息?
简单地说,就是把一幅图像中每一个像素出现的次数都先统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把像素与该 像素出现的频率用图表示出来,就是灰度直方图,反映了图像的灰度分布
3.直方图均衡化是什么意思?它的主要用途是什么?均衡化后的图像有什么特点?
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对 集 中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。