MATLAB图像处理——学习笔记

由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。

很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。

1. matlab命令基础:

clc——清除窗口

clear——清除之前赋值过的变量

disp——打印信息,相当于echo

celldisp——打印元胞数组内容

who——简单的显示当前已有变量

whos——显示所有变量及详细内容 whos也可以指定显示某个变量

tan/sin/cos/log ——各种数学运算

...——用来续行

定义数组——x=1:100

定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[]

矩阵转置——A=[1 3 5 7]  B=A‘ 或 B=A.‘可以把行向量转换为列向量

取元素——A(1)取A中第一个元素  A(1:5)取A中第一到五的元素

A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量

A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)

linspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b

:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列  A(1:2, 1:3) 取两行三列

+

-

*——* 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,

.*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理

/

format compact——以紧凑方式显示

format loose  ——以松散方式显示

zeros(M,N)——生成一个M*N的double型矩阵 元素均为0

ones(M,N)——生成一个M*N的double型矩阵 元素均为1

true(M,N)——生成一个M*N型的logical矩阵,元素均为1

false(M,N)——与上面的true相反

magic(M,N)——生成一个魔术幻阵

rand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]

randn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1.

plot(X,Y)——画二维图像

subplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号

plot3(X,Y,Z)——画三维图

mesh(X,Y,Z)——画三维图

surf(X,Y,Z)——画三维图,并上色

matlab程序设计:

.m文件建立的函数文件

function [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字

% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释

function [g,k,l] = two(x)
error(nargchk(1,1,nargin))
% error(nargchk(1,2,nargin))
if x<=1
    g = x;
end
g = 0;
k = nargin;
l = nargout;
for i=1:1:x
    g = g + i;
end

调用时写tow(10),就可以计算1~10的和。

匿名函数:

var = @(x)(x+1)

调用时形如var(1)即可,@后面跟参数列表

接受用户输入信息:

t = input(‘Enter you data:‘, ‘s‘);

t=‘12.6, x2y, z‘;

[a,b,c] = strread(t, ‘%f%q%q‘, ‘delimiter‘, ‘,‘) //按指定的格式读入a b c

matlab中图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。

灰度、亮度、强度通常是同一个概念。

所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP 矢量图:PNG

机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。

nargin将返回输入到函数的参数个数、nargout用于函数的输出

nargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:

function G = test(X, Y)

error(nargchk(1,2,nargin));

2. 图像处理基础:

imread——读入图像A=imread(‘1.jpg‘)

imshow——显示图像imshow(A, B);  imshow(A, [low high]);

会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色

若B省略,默认的灰度级是256,imshow(A, [])  []表示将low设为A的最小值 将high设为A的最大值

显示多幅图像:imshow(A), figure,imshow(B)

imwrite——保存图像 imwrite(A, ‘2.jpg‘)

imwrite(A, ‘2.jpg‘, ‘quality‘, q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)

size(A)——显示图像的大小

imfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo(‘1.jpg‘) 就可以使用K.Height K.Width等等信息

学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize

imgBytes / compress_bytes ==
压缩比

A=imread(‘1.jpg‘);

A(1,1,:)          ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值

B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]

im2double   ——若输入是uint8类型 每个值会除以255.

mat2gray()   ——可以将double类型转换为归一化的double类型

区别:

im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;

如果输入类型是double,输出没有处理;

double:返回数值与输入相同的double类型矩阵;

mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。

在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。

C=[-1,0.5; 2,3]

B=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255

im2bw          ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5)

IPT支持的图像的算术函数:

imadd——图像相加

imsubtract——图像相减

immultiply——图像相乘

imdivide          ——图像相除

imabsdiff——计算两幅图像之间的绝对差

imcomplement——对图像求补

imlincomb——计算两幅或多幅图像的线性组合

图像旋转函数imrotate,matlab默认是逆时针旋转

imrotate参数解释:

angle顾名思义 就是你旋转的角度

method 就是你实现旋转用的是什么方法,有三种  和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是  ‘nearest‘
   ‘bilinear‘    ‘bicubic‘。

不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的

最后说说bbox   这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’

loose  就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片

matlab的解释是 When BBOX is ‘loose‘, B

includes the whole rotated image, which generally is larger than A.

crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop  超过图片原来大小的部分被crop了

>> subplot(2,2,1)
>> imshow(A)
>> subplot(2,2,2)
>> imshow(imrotate(A, 30, 'bilinear', 'loose'));
>> subplot(2,2,3)
>> imshow(imrotate(A, 30, 'bilinear', 'crop'));

3. 亮度变换与空间滤波:

1. 亮度

imadjust函数

A=imread(‘1.jpg‘);

B= imadjust(A, [], [], 0.75); // gamma<1 变亮

imshow(B)

C=imadjust(A, [0 1], [1 0]);

效果等价于C=imcomplement(A) 都是求图像的负片

2. 对比度拉伸函数

g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出

3. 直方图

imhist函数:

h = imhist(f, b) //b是灰度级个数 默认是256

numel(f) //得到像素点个数

B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);

直方图均衡化:

histeq函数:

J=histeq(I)

实例:

>> A=imread('test.jpg');
>> B=rgb2gray(A);
>> imhist(B);//显示直方图
>> figure;
>> imhist(histeq(B)) //显示均衡化后的直方图
>> C=histeq(B);
>> imwrite(C, 'xxx.jpg');

4. 空间滤波:

线性空间滤波:imfilter函数

g=imfilter(f,w,filtering_mode, boundary_options, size_options);

//filtering_mode=corr/conv size_options=same/full

通用语法为 g = imfilter(f, w, ‘replicate‘);

非线性滤波:colfilt函数

IPT中的线性滤波器:

fspecial函数用来生成滤波掩膜w

w = fspecial(‘type‘, parm) //type表示滤波器类型

type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp

实例:

使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调

test_shape.m

function [] = test_sharp(A)
% Test Sharp
B= im2double(A);
w= fspecial('laplacian', 0);//laplacian时 第二个参数默认是0.5
C= imfilter(B, w, 'replicate');
D= B-C;
imwrite(D, 'out.jpg');
最后对比A与C的效果  发现图像明显更为清晰了。。。
可以直接用unsharp选项,效果与上面的差不多
A=imread('test.jpg');
w = fspecial('unsharp')
B=im2double(A);
C=imfilter(B, w, 'replicate');
imwrite(C, 'out.jpg');

上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:

function [] = test_sharp(A)
w4 = fspecial('laplacian', 0);
w8 = [1 1 1; 1 -8 1; 1 1 1];
A = im2double(A);
A4 = A - imfilter(A, w4, 'replicate');
A8 = A - imfilter(A, w8, 'replicate');
imwrite(A4, '4.jpg');
imwrite(A8, '8.jpg');

会发现图像锐化效果更好,图像更清晰。

IPT中的非线性滤波器:

ordfilt2函数  g = ordfilt2(f, order, domain)

中值滤波medfilt2

图像中加入噪声:格式:J = imnoise(I, type, parm)

>> A=imread(‘test.jpg‘);

>> B = imnoise(A, ‘salt & pepper‘, 0.02);

>> C=rgb2gray(B);

>> D=medfilt2(C, [3 3]);//中值滤波

>> imwrite(D, ‘xxx.jpg‘)

4. 彩色图像处理

>> A = imread("test.jpg");

%获取图像R、G、B每个分量

>> R = A(:,:,1);

>> G = A(:,:,2);

>> B = A(:,:,3);

>> D = cat(3, R, G, B); //cat组合成图像

clear
rgb=imread('xxx.jpg');
rgb_r=rgb(:,:,1);
rgb_g=rgb(:,:,2);
rgb_b=rgb(:,:,3);
[x y z]=size(rgb);
zero=zeros(x, y);
R=cat(3,rgb_r,zero,zero);
G=cat(3,zero,rgb_g,zero);
B=cat(3,zero,zero,rgb_b);
RGB=cat(3,rgb_r,rgb_g,rgb_b);
subplot(2,2,1),imshow(R),title('红色分量');
subplot(2,2,2),imshow(G),title('绿色分量');
subplot(2,2,3),imshow(B),title('蓝色分量');
subplot(2,2,4),imshow(RGB);

时间: 2024-07-29 23:14:45

MATLAB图像处理——学习笔记的相关文章

[学习一个] Matlab GUI 学习笔记 Ⅰ

Matlab GUI 学习笔记 Ⅰ 1. Foreword Matlab 是严格意义上的编程语言吗?曾经有人告诉我他是通过 Matlab 学会了面对对象编程,我是不信的,但这依然不妨碍它在特殊领域的强大功能.因为选修了这1个学分的 Matlab GUI 设计,亦有人表达了对Previous Matlab Blog的一些情绪,便写上一些 Matlab GUI 编程学习的心得. 标题虽为Matlab GUI 学习笔记 Ⅰ,亦可成为称为图像处理技术应用实践 - 课程设计 1 指北. 本文所用环境为 M

Nani_xiao的图像处理学习笔记:透视变换(二):X,Y方向校正原理

接着上一篇进行,上一篇为: Nani_xiao的图像处理学习笔记:透视变换(一) 这里采用一点透视投影 X 方向校正 图2 是透视投影的灭点原理图.在不考虑其他畸变的情况下,边ab 和边cd 平行于X 轴, 而边ac 和边bd 则和X 轴成一定的夹角.根据a .b .c .d 点的图像坐标,可以求出透视投影的灭点e 的坐标(mx , my)(在图像坐标系下). 然后根据透视缩小效应, 对其进行反运算, 进行X 方向的校正.在X 方向的校正中, 可以选择图像高度(0- H - 1)任意一条水平线的

Nani_xiao的图像处理学习笔记:透视变换(三):校正步骤

接着上两篇进行: Nani_xiao的图像处理学习笔记:透视变换(一) Nani_xiao的图像处理学习笔记:透视变换(二):X,Y方向校正原理 图像透视变换校正步骤为: 1.      选取控制点的坐标: 2.      如果控制点存在倾斜现象, 则进行Y方向和X 方向错切: 3.      计算灭点的坐标(mx ,my ): 4.      进行X 方向的校正, 并输出校正后的图像: 5.      进行Y方向的校正, 并输出校正后的图像. 这里先把步骤列出,以后再根据实际效果补图

数字图像处理学习笔记之一 DIP绪论与MATLAB基础

写在前面的话 数字图像处理系列的学习笔记是作者结合上海大学计算机学院<数字图像处理>课程的学习所做的笔记,使用参考书籍为<冈萨雷斯数字图像处理(第二版)(MATLAB版)>,同时学习过程中会参考网络学习资源.对于数字图像处理的学习不可能仅仅依靠作者所写的这一系列笔记,而是需要花时间和精力学习,本文只可作参考和交流之用.由于涉及此学科不久,在学习过程中难免存在错误,请读者不吝赐教. 数字图像处理绪论 数字图像处理(DIP)的研究目标和处理对象: DIP的研究目标是获取信息,处理对象是

数字图像处理学习笔记之二 灰度变换与空间滤波

综述 对于图像的处理有两种思路,一种是对图像本身的直接处理,即空间域处理:另一种是在频率域进行处理.关于空域和频域,可以参考<傅里叶变换--另一种世界观>.在空间域的处理相对简单,因此首先介绍的是空域处理法.空域中有两种重要处理方法:灰度变换(或亮度变换)和空间滤波(或邻域处理.空间卷积). 空间域处理:灰度变换和空间滤波 g(x,y)=T[ f(x,y) ] 空域处理的思路可以由上式表达.f 即是原图,T 是在点(x,y)指定邻域上的图像处理算子,g 是输出图像.当邻域为1*1大小时,T 为

数字图像处理(MATLAB版)学习笔记——第1章 绪言

0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成果的. 1.本章知识点结构 2.书中例子实践 第一个例子,试一试手. 1 function f = twodsin(A, u0, v0, M, N) 2 f = zeros(M, N); 3 for c = 1:N 4 v0y = v0 * (c - 1); 5 for r = 1:M 6 u0x

MATLAB数字图像处理学习笔记

我们都知道一幅图片就相当于一个二维数组,可以用一个矩阵来表示,而MATLAB可以说就是为矩阵运算而生的,所以学习图像处理,学习MATLAB势在必行! 一. MATLAB基础知识 1. 读取图像 1 %imread ('filename') 2 f = imread ('lena,jpeg')%图片必须和工程在同一个目录下 3 f = imread ('E:\MATLAB\lena,jpeg')%加上路径进行读取图像操作 4 f = imread ('.\MATLAB\lena,jpeg')%读取

数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波

0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> f=imread('myimage.jpg'); >> g1 = imadjust(f, [0 1], [1 0]); >> imshow(g1); >> imshow(f); >> g2 = imadjust(f, [0.5 0.75], [0 1]); &g

hog特征原理详解及matlab代码学习笔记

1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主. (1)主