一、实验目的
1、熟悉并掌握MATLAB工具的使用;
2、实现图像的读取、显示、代数运算和简单变换。
二、实验环境
MATLAB 2016以上版本、WIN XP或WIN2000计算机
三、常用函数和调用格式
1.读写图像文件
1)imread
imread函数用于读入各种图像文件,如:a=imread('e:\w01.tif')
2)imwrite
imwrite函数用于写入图像文件,如:imwrite(a,'e:\w02.tif',’tif’)
3)imfinfo
imfinfo函数用于读取图像文件的有关信息,如:imfinfo('e:\w01.tif')
2.图像的显示
1)image
image函数是MATLAB提供的最原始的图像显示函数,如:
a=[1,2,3,4;4,5,6,7;8,9,10,11,12];
image(a);
2)imshow
imshow函数用于图像文件的显示,如:
i=imread('e:\w01.tif');
imshow(i);
title(‘原图像’)%加上图像标题
3)colorbar
colorbar函数用显示图像的颜色条,如:
i=imread('e:\w01.tif');
imshow(i);
colorbar;
4)figure
figure函数用于设定图像显示窗口,如:figure(1); /figure(2);
5)subplot
把图形窗口分成多个矩形部分,每个部分可以分别用来进行显示。
Subplot(m,n,p)分成m*n个小窗口,在第p个窗口中创建坐标轴为当前坐标轴,用于显示图形。
6)plot
绘制二维图形
plot(y)
Plot(x,y)xy可以是向量、矩阵。
3.图像类型转换
1)rgb2gray
把真彩图像转换为灰度图像
i=rgb2gray(j)
2)im2bw
通过阈值化方法把图像转换为二值图像
I=im2bw(j,level)
Level表示灰度阈值,取值范围0~1(即0.n),表示阈值取自原图像灰度范围的n%
3)imresize
改变图像的大小
I=imresize(j,[m n])将图像j大小调整为m行n列
4.图像运算
1)imadd
两幅图像相加,要求同样大小,同种数据类型
Z=imadd(x,y)表示图像x+y
2)imsubstract
两幅图像相减,要求同样大小,同种数据类型
Z=imsubtract(x,y) 表示图像x-y
3)immultiply
Z=immultiply(x,y) 表示图像x*y
4)imdivide
Z=imdivide(x,y) 表示图像x/y
读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口(1行三列)来分别显示RGB图像和灰度图像,注上文字标题。
代码:
读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口(1行三列)来分别显示RGB图像和灰度图像,注上文字标题。
代码:
% 图片文件名为image3.jpg,并且该文件位于E盘的photo文件夹中
imageFilePath = 'E:\photo\image3.jpg'; % 这里的文件名与实际文件名相匹配
% 读取RGB图像
rgbImage = imread(imageFilePath);
% 检查图像是否成功读取
if isempty(rgbImage)
error('无法读取图像文件,请检查文件路径是否正确。');
end
% 将RGB图像转换为灰度图像
grayImage = rgb2gray(rgbImage);
% 使用默认的方法将灰度图像转换为二值图像
binaryImage = imbinarize(grayImage);
% 创建一个1行3列的子窗口布局
subplot(1, 3, 1);
% 显示RGB图像,并添加标题
imshow(rgbImage);
title('原图像');
% 在第二个子窗口中显示灰度图像,并添加标题
subplot(1, 3, 2);
imshow(grayImage);
title('灰度图像');
% 在第三个子窗口中显示二值图像,并添加标题
subplot(1, 3, 3);
imshow(binaryImage);
title('二值图像');
对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成六个子窗口(2行4列)来分别显示,注上文字标题。
% 有两个图像,image3和image4,它们已经被加载到内存中
% 这里使用imread函数读取图像文件
image1 = imread('E:\photo\image3.jpg');
image2 = imread('E:\photo\image4.jpg');
% 检查两个图像的尺寸是否相同,如果不同,则需要进行调整
if size(image1) ~= size(image2)
% 通过插值方法调整图像2的尺寸以匹配图像1的尺寸
image2 = imresize(image2, size(image1));
end
% 创建一个2行4列的子窗口布局
% 第一行显示原始图像和加法结果
subplot(2, 4, 1);
imshow(image1);
title('Image 1');
subplot(2, 4, 2);
imshow(image2);
title('Image 2');
% 执行加法操作并显示结果
sumImage = image1 + image2;
subplot(2, 4, 3);
imshow(sumImage, []);
title('Addition (加法)');
% 执行减法操作并显示结果
differenceImage = image1 - image2;
subplot(2, 4, 4);
imshow(differenceImage, []);
title('Subtraction (减法)');
% 执行乘法操作并显示结果
productImage = image1 .* image2;
subplot(2, 4, 5);
imshow(productImage, []);
title('Multiplication (乘法)');
% 执行除法操作并显示结果
% 为了避免除以零的错误,我们首先检查图像2中是否有零值
epsilon = 1e-6; % 一个小的数,用来避免除以零
image2(image2 == 0) = epsilon; % 将零值替换为epsilon
quotientImage = image1 ./ image2;
subplot(2, 4, 6);
imshow(quotientImage, []);
title('Division (除法)');
对一幅图像进行灰度变化,实现图像变亮、变暗和负片效果,在同一个窗口内分成四个子窗口(2行2列)来分别显示,注上文字标题。
% 读取彩色图像
image = imread('E:\photo\image3.jpg'); % 替换为图像文件路径
% 图像变亮
% 通过增加一个常数来增加图像的亮度,注意避免超过RGB范围
brightenedImage = uint8(image + 50);
brightenedImage(brightenedImage > 255) = 255; % 限制最大值为255
% 图像变暗
% 通过减少一个常数来降低图像的亮度,注意避免低于0
darkenedImage = uint8(image - 100);
darkenedImage(darkenedImage < 0) = 0; % 限制最小值为0
% 负片效果
% 通过从最大值(255)中减去每个颜色通道的值来实现负片效果
negativeImage = 255 - image;
% 创建一个2行2列的子窗口布局
subplot(2, 2, 1);
imshow(image);
title('原图像');
subplot(2, 2, 2);
imshow(brightenedImage);
title('图像变亮');
subplot(2, 2, 3);
imshow(darkenedImage);
title('图像变暗');
subplot(2, 2, 4);
imshow(negativeImage);
title('负片效果');
用 MATLAB 编制程序,产生并输出以下各种序列的图形(两幅图,分别2行2列显示)
① 单位冲击序列(长度为41);
② 单位阶跃序列(长度为41)
③ 正弦序列xn = A ∙ sin[2πfn + (2/3)π],f = 0.5,A =-0.2, -10 < �� < 10 (n间隔为0.01)
④ 指数序列xn = 1.1n -20 < n < 20 (n 间隔为 0.5)
⑤ 复指数序列xn = 4 ∗ e(-0.2+j0.5)n,-40 < n < 40,输出其实部(real), 虚部(imag), 幅值(abs)和
相位(angle)的图形。(exp)
% 初始化图形窗口
figure;
% ① 单位冲击序列 (长度为 41)
n = 0:40;
impulseSequence = zeros(1, 41);
impulseSequence(18) = 1; % 在第21个位置放置单位冲击
impulseSequence(22) = 1; % 在第21个位置放置单位冲击
subplot(2, 2, 1); % 第一个子图
stem(n, impulseSequence);
title('单位冲击序列');
% ② 单位阶跃序列 (长度为 41)
stepSequence = zeros(1, 41);
stepSequence(21:end) = 1; % 从第21个位置开始为1
subplot(2, 2, 2); % 第二个子图
stem(n, stepSequence);
title('单位阶跃序列');
% ③ 正弦序列
n = -10:0.01:9.99;
A = -0.2;
f = 0.5;
sinSequence = A * sin(2 * pi * f * n + (2/3) * pi);
subplot(2, 2, 3); % 第三个子图
plot(n, sinSequence);
title('正弦序列');
% ④ 指数序列
n = -20:0.5:19.5;
exponentialSequence = 1.1 .^ n;
subplot(2, 2, 4); % 第四个子图
plot(n, exponentialSequence);
title('指数序列');
% 初始化图形窗口
figure;
% 复指数序列的定义
n = -40:1:39; % 从-40到39,间隔为1
A = 4; % 系数A
alpha = -0.2 + 1i * 0.5; % 复频率
% 生成复指数序列
complexExponential = A * exp(1i * alpha * n);
% 绘制实部
subplot(2, 2, 1); % 第一个子图
plot(n, real(complexExponential));
title('实部');
% 绘制虚部
subplot(2, 2, 2); % 第二个子图
plot(n, imag(complexExponential));
title('虚部');
% 绘制幅值
subplot(2, 2, 3); % 第三个子图
magnitude = abs(complexExponential);
plot(n, magnitude);
title('幅值');
% 绘制相位
subplot(2, 2, 4); % 第四个子图
phase = angle(complexExponential);
plot(n, phase);
title('相位');