01.引言
MATLAB是一个对于非计算机专业的学生非常友好的编程环境,尤其是对于工程科学和数学领域的应用。MATLAB的一个重要特点是它提供了大量预构建的函数,这些函数可以帮助用户在数值分析、图形处理、信号处理和线性代数等领域进行高效的编程。同时,MATLAB的编程语言相对简洁直观,不需要像C++或Java那样关注太多底层的细节,这使得初学者可以更快地开始编写程序,并看到实际的成果。
02.数据的读取
信号处理的第一步是对待处理信号进行读取。在利用MATLAB软件进行处理之前,必须先将信号导入系统。以下是一些关于数据读取的MATLAB代码以及相关例子:
(1)读取.mat文件
load sumsin
(2)读取Excel文件
% 读取Excel文件
data = xlsread('example.xlsx');
(3)读取.csv文件
% 读取.csv文件
data = csvread('example.csv');
(4)读取.语音文件(并添加噪声)
[X,fs]= audioread('speech_dft.wav');
(5)读取.png图片文件
RGB = imread('peppers.png');
[X,map] = rgb2ind(RGB,128);%真彩图像转化为索引图像
G = rgb2gray(RGB); %真彩色图像转化为灰度图像;
size(RGB)%真彩图像是三维数组,每个通道每个像素点有其颜色值,颜色取值为[0,255]
size(map)%三个通道颜色值量化为128个颜色,每个颜色有R,G,B三个通道值。
size(X)%图像像素对应map中一个值,取值为[0,128]
size(G)%灰度图像每个像素对应一个灰度值,取值为[0,255]
figure(1), imshow(RGB);
imwrite(RGB,'Fig1-6(a)RGB.jpg','jpg');
figure(2), imshow(X,map);%索引图像,为彩色的
figure(3), imshow(X);%量化为[0,128]的灰度图
imwrite(X,'Fig1-6(c)X128.jpg','jpg');
figure(4), imshow(G);%灰度图像,灰度值[0,255]
imwrite(G,'Fig1-6(d)Gray.jpg','jpg');
本段代码演示了如何在MATLAB中处理图像信号,特别是如何从真彩色图像转换到索引图像和灰度图像,并展示以及保存这些图像的过程。具体效果如下:
1. 通过`imread`函数读取名为`peppers.png`的真彩色图像到变量`RGB`中。此图像是一个三维数组,其中包含了红色(R)、绿色(G)、和蓝色(B)三个颜色通道的数值,每个通道内的颜色值范围是0到255。
2. 使用`rgb2ind`函数将真彩色图像`RGB`转换为索引图像`X`和对应的颜色映射表`map`,颜色被量化到128个不同的颜色值中。`X`中的每个值对应`map`中的一个颜色,颜色值范围是从0到128。
3. 使用`rgb2gray`函数将真彩色图像`RGB`转换为灰度图像`G`。在灰度图像中,每个像素点对应一个灰度值,取值范围同样是从0到255。
4. 使用`size`函数分别查看`RGB`、`map`、`X`、和`G`的尺寸,以验证其数据结构和维度。
5. 使用`figure`和`imshow`函数分别显示真彩色图像、索引图像(彩色)、单独的索引图像(量化后的灰度图)、和灰度图像。每种图像展示了从原始真彩图像到不同图像格式的转换。
6. 通过`imwrite`函数,代码将转化后的索引图像和灰度图像保存为JPEG文件,分别命名为`Fig1-6(a)RGB.jpg`、`Fig1-6(c)X128.jpg`和`Fig1-6(d)Gray.jpg`。
总结而言,这段代码展示了在MATLAB中如何对图像数据进行读取、转换和保存。从真彩色到索引图像的转换使得图像在保留视觉质量的同时减少了颜色的数量,而转换为灰度图像则是常见的图像处理步骤,用于减少计算复杂性或用于特定的图像分析任务。
(6)读取视频文件
% 读取视频文件 'xylophone.mpg', 标记为 'myreader1'.
readerobj = VideoReader('xylophone.mpg', 'tag', 'myreader1');
% 读取视频所有帧.
vidFrames = read(readerobj);
% 得到视频的总帧数
numFrames = get(readerobj, 'NumFrames');
%从视频结构建立Matlab视频流
for k = 1 : numFrames
mov(k).cdata = vidFrames(:,:,:,k);
mov(k).colormap = [];
end
% 建立图像
hf = figure;
% 根据视频的宽度和高度重新规划视频图像大小——拉伸
set(hf, 'position', [150 150 readerobj.Width readerobj.Height])
% 重放视频
movie(hf, mov, 1, readerobj.FrameRate);
03.实际应用:图像的类型转换
%调用程序,显示各分量。
rgb = imread('peppers.png');
hsi = Rgb2hsi(rgb);
H = hsi(:,:,1);
S = hsi(:,:,2);
I = hsi(:,:,3);
figure(1),imshow(H, []);
%灰度拉伸到0-255,进行输出
imwrite(uint8((H-min(min(H)))./(max(max(H)-min(min(H)))).*255),'H.jpg','jpg')
figure(2),imshow(S, []);
imwrite(S,'S.jpg','jpg')
figure(3),imshow(I, []);
imwrite(I,'I.jpg','jpg')
Nrgb = Hsi2rgb(hsi);
Nrgb = im2uint8(Nrgb);%图像格式转化
max(max(rgb-Nrgb))
R = Nrgb(:,:,1);
G = Nrgb(:,:,2);
B = Nrgb(:,:,3);
figure(4),imshow(R, []);
imwrite(R,'R.jpg','jpg')
figure(5),imshow(G, []);
imwrite(G,'G.jpg','jpg')
figure(6),imshow(B, []);
imwrite(B,'B.jpg','jpg')
代码效果
这段代码是用于处理图像的RGB到HSI(色调、饱和度、亮度)的转换,然后再转换回RGB,并将各个分量显示并保存成图像文件。让我来解释一下:
rgb = imread('peppers.png');
: 从名为 “peppers.png” 的图像文件中读取RGB图像数据。hsi = Rgb2hsi(rgb);
: 将RGB图像数据转换为HSI颜色空间。H = hsi(:,:,1);
,S = hsi(:,:,2);
,I = hsi(:,:,3);
: 从转换后的HSI图像中提取出色调(H)、饱和度(S)、亮度(I)三个分量。figure(1),imshow(H, []);
: 显示色调分量。imwrite(uint8((H-min(min(H)))./(max(max(H)-min(min(H)))).*255),'H.jpg','jpg')
: 对色调分量进行灰度拉伸,然后保存成 “H.jpg” 图像文件。同样的步骤对饱和度和亮度分量进行显示和保存。
Nrgb = Hsi2rgb(hsi);
: 将HSI图像数据转换回RGB颜色空间。Nrgb = im2uint8(Nrgb);
: 将转换后的RGB图像数据转换成uint8格式。max(max(rgb-Nrgb))
: 计算转换前后RGB图像之间的最大差异。分别提取转换后的RGB图像的三个分量:红色(R)、绿色(G)、蓝色(B)。
将各个RGB分量显示并保存成图像文件。
代码的效果是将原始RGB图像转换为HSI颜色空间,然后再转换回RGB,并分别显示和保存各个分量。