MATLAB数字图像处理
一.准备工作
1.安装MATLAB
2.熟悉界面
写代码主要使用两个地方,一个是编辑器,另一个是命令行窗口,各自有各自的功能和用法。
编辑器是用来编写和运行MATLAB代码文件的工具,它可以让您创建、修改、保存和调试代码文件。编辑器只能通过点运行或者选中要用的代码后右键“执行所选代码”或者在命令行窗口中输入文件名的方式运行。编辑器中的代码文件通常以.m为扩展名,它们可以是脚本文件或函数文件。编辑器还提供了一些方便的功能,如语法高亮、断点设置、代码折叠等。
命令行窗口是用来执行一条条单独命令的工具,它可以让您进行各种计算操作,也可以使用命令打开各种MATLAB工具,还可以查看各种命令的帮助说明等。命令行窗口的指令行“头首”的“>>”是自动生成的,为运算提示符,表示MATLAB处于准备就绪阶段;在运算提示符后输入命令以后,按enter键,就会在命令行窗口出现相应的结果,并会将结果保存在工作区窗口。
3.编辑器常用快捷键
这里是一些个人常用的快捷键:
Ctrl + A:全选代码
Ctrl + I:自动对齐代码(整理缩进)
Ctrl + R:注释选中的代码
Ctrl + T:取消注释选中的代码
Ctrl + Z:撤销改动
Ctrl + Y:取消撤销
Ctrl + F:查找或替换变量名、函数名
Ctrl + W:关闭当前的程序文本文件
Ctrl + PageUp/PageDown:在编辑器窗口中切换文件
Ctrl + G:直接跳至某行
F1:打开当前光标处的函数的帮助文档
Ctrl + F1:显示当前光标处的函数的参数信息提示
F5:保存并直接运行程序
F9:执行选中的代码段
F10:单步执行
F11:进入子函数
Shift + F11:退出子函数
F12:设置或取消断点
二.图像变换
图像处理是图像处理和图像分析的一个重要分支,它将图像从空间域变换到变换域,然后在变换域对图像进行处理和分析。常用的图像变换有傅里叶变换、DCT变换、 小波变换等。
下面以傅里叶变换演示图像。
先准备一张图片test.jfif,键入下面代码:
close all;
clear all;
I = imread('test.jfif');
I_fft = fft2(I);
figure('NumberTitle','off','Name','傅里叶变换演示程序',...
'MenuBar', 'none', 'Color','w' );
axes_121 = subplot(1,2,1);
imshow(I);
axes_122 = subplot(1,2,2);
imshow(log(abs(fftshift(I_fft))), []);
title(axes_121, '原始图像', 'Color','r', 'BackgroundColor','y');
title(axes_122, '傅里叶变换后图像','Color','r','BackgroundColor','y');
如果你准备的图像是彩色的,在傅里叶变换以后可能会导致图像的灰度值超出了可显示的范围,导致出现下面的结果:
这时候可以修改一下代码,先将改变原图像的灰度值,再进行傅里叶变换:
close all;
clear all;
I = imread('test.jfif');
I1=rgb2gray(I);//转换灰度值
I_fft = fft2(I1);
figure('NumberTitle','off','Name','傅里叶变换演示程序',...
'MenuBar', 'none', 'Color','w' );
axes_121 = subplot(1,2,1);
imshow(I);
axes_122 = subplot(1,2,2);
imshow(log(abs(fftshift(I_fft))), []);
title(axes_121, '原始图像', 'Color','r', 'BackgroundColor','y');
title(axes_122, '傅里叶变换后图像','Color','r','BackgroundColor','y');
结果如下:
三.图像编码压缩
图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许失真的条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。
准备一张灰白图片,代码参考如下:
close all;clear all;
I = imread('r.png');
I = rgb2gray(I);
I = im2double(I);
T = dctmtx(8);
dct = @(block_struct) T * block_struct.data * T';
B =blockproc(I,[8 8],dct);
mask =[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data);
invdct = @(block_struct) T' * block_struct.data * T;
I2 = blockproc(B2,[8 8], invdct);
figure('NumberTitle','off','Name','基于离散余弦变换的图像压缩',...
'MenuBar','none', 'Color','w');
axes_121 = subplot(1,2,1);
imshow(I);
axes_122 = subplot(1,2,2);
imshow(I2);
imwrite(I,'压缩前.png');
imwrite(I2,'压缩后.png');
info_before = imfinfo('压缩前.png');
info_after = imfinfo('压缩后.png');
title(axes_121, sprintf('压缩前(FileSize= %d bytes)',...
info_before.FileSize), 'Color','r','BackgroundColor','y');
title(axes_122, sprintf('压缩后 (FileSize= %d bytes)',...
info_after.FileSize), 'Color', 'r', 'BackgroundColor', 'y');
结果如下:
去文件夹下可以查看压缩后的图像,可看到压缩前后图像的字节大小得到改变。
如果使用的图片不是灰白图片,这里会出现报错:
BLOCKPROC 在计算用户提供的函数句柄 FUN 时遇到错误。
错误的原因是:
错误使用 *
用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*'。
出错 @(block_struct)T*block_struct.data*T'
出错 blockprocFunDispatcher (第 13 行)
output_block = fun(block_struct);
出错 blockprocInMemory (第 97 行)
ur_output = blockprocFunDispatcher(fun,block_struct,trim_border);
出错 blockproc (第 251 行)
result_image = blockprocInMemory(source,fun,options);
出现这个问题的原因是该代码中的函数句柄不适用于彩色图像。
@(block_struct) T * block_struct.data * T'
其中 T 是一个 8×8 的 DCT 矩阵, block_struct.data 是一个 8×8×3 的 RGB 图像块。
四.图像增强和复原
图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,它所做的仅仅是突出图像中所感兴趣的部分。如强化图像的高频分量,以使图像中 物体轮廓清晰,细节明显;如强化低频分量以降低噪声的影响。图像复原要求对图像降质的原因有一定的了解,一般来讲应根据降质过程建立“降质模型” ,再采用某种滤波方法,恢复或重建原来的图像。
五.图像分割
图像分割是数字图像处理中的关键技术之一。图像分割的目的在于将图像中有意义的特征部分提取出来,这些特征包括图像中的边缘、区域等,它们是进一步进行图像识别、分析和理解的基础。虽然已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的 有效方法。因此,对图像分割的研究还在不断深入之中,该技术分支始终是图像处理中的研究热点之一。
六.图像描述
图像描述是图像识别和理解的必要前提。对于最简单的二值图像可采用其几何特征来对物体的特性进行描述,对于一般的图像,通常采用基于二维形状的的描述方法(包括边界描述和区域描述两大类方法)。对于特殊的纹理图像可采用二维纹理特征来对其进行描述。随着图像处理研究的不断深入,对于三维物体描述的研究工作已然发展迅猛,研究者们相继提出了体积描述、表面描述和广义圆柱体描述等方法。
close all; clear all;
image = rgb2gray(imread('b.jpg'));
offsets = [zeros(40, 1) (1 :40)'];
glcms = graycomatrix(image, 'Offset',offsets);
stats = graycoprops(glcms, 'Contrast Correlation');
figure('NumberTitle','off','Name','纹理特征提取',...
'MenuBar','none','Color','w');
subplot(1, 2, 1);
imshow(image);
subplot(1, 2, 2);
plot([stats.Correlation], 'LineWidth', 3);
title('Texture Correlation as a function of offset');
xlabel('Horrizontal Offset');
ylabel('Correlation');
此曲线反映的是:在不同的水平偏移量下,相关统计值的变化趋势。
七.图像分类(识别)
图像分类(识别)属于模式识别的范畴, 其主要内容是图像经过某些预处理(增强、复原、压缩)后, 进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。