准备与基本原理

  • 零.准备与环境
  • 一.数字图像的表示
    • 1.1 坐标约定
    • 1.2 矩阵表示
  • 二. 读取图像
  • 三.显示图像
  • 四.保存图片
  • 五.数据类
  • 六.图像类型
    • 6.1分类
    • 6.2亮度图像
    • 6.3二值图像
  • 七.图像和数据类转换
    • 7.1数据类的转换
    • 7.2图像类和类型间的转换
  • 八.数组索引
    • 8.1向量索引
    • 8.2矩阵索引
    • 8.3选择数组维数
  • 九.一些重要的标准数组
  • 十.运算符
  • 十一.流控制
    • 11.1if语句
    • 11.2for语句
    • 11.3While
    • 11.4switch
  • 十二.向量化
  • 十三.IO流
  • 十四.单元数组与结构

零.准备与环境

因为以前有过图像处理的基础:PythonCV学习记录1——如何安装Opencv库并在Python中调用
所以有些细节不会记录很很很详细。
同时,MATLAB的版本是2018b,也就是v9.5,也写过安装教程:Ubuntu18.04安装Matlab2018a
Matlab的使用介绍也不用多介绍了。书里是用的Matlab的图像处理工具箱IPT,感觉语法有些像OpenCV
最后,学习是基于冈萨雷斯的数字图像处理MATLAB版第三版

一.数字图像的表示

1.1 坐标约定

Matlab的坐标不像Python或者C++里的方式,它的原点是(1,1)。且规定元组的组成为(M,N) M是行 N是列
另外:IPT工具箱里有可能有少部分以(row,col)的表示方法,看源码的时候要注意

1.2 矩阵表示

Python中可等同于numpy的数组,而C++里是Mat,而听说Matlab是一个面向数组的语言???所以它本身就可以支持数组变量,且构成如下:

有:1 × N的矩阵为行向量,M × 1的矩阵为列向量,1 × 1的矩阵则为标量
Matlab里的变量由字母开头,且只能由字母、数字和下划线组成。

二. 读取图像

Matlab支持读取以下格式的图像:

语法类似CV:

f = imread('filename');

它可以是绝对路径,也可以是相对路径。
记得加;可以使命令行窗口,不输出f的值,否则看着很乱。
矩阵f的属性可以这样获取:

[m, n] = size(f)

得到具体的行列数:

或者:

whos f

得到具体的矩阵信息:

三.显示图像

显示图像和CV的语法有些差别:

imshow(f)

当然,如果这幅图像是灰度图的话,可以添加灰阶级数矩阵G作为滤波:

imshow(f, [low high])

其中低于low的值为灰色,高于high的值为白色,之间的值为中等亮度值。
当然,也可以用figure创建窗体,显示多个图片。

四.保存图片

保存图片按道理来说应该用的不多,记一下即可:

imwrite(f, 'filename')
imwrite(f,'filename.jpg', 'quality', q)

接触过JPG图像的话,应该知道jpg可以压缩,q是压缩率 0~100

还可以用imfinfo来查看图像的各种信息,返回的是一个结构体,可以用.访问,结构体组成如下:

           Filename: 'D:\Matlab_WS\test.jpg'FileModDate: '17-Mar-2018 21:50:22'FileSize: 302838Format: 'jpg'FormatVersion: ''Width: 1090Height: 1090BitDepth: 24ColorType: 'truecolor'FormatSignature: ''NumberOfSamples: 3CodingMethod: 'Huffman'CodingProcess: 'Sequential'Comment: {}

五.数据类

没啥看的,按位宽定的数据类型

六.图像类型

6.1分类

工具箱支持以下四种图像类型:

  • 亮度图像
  • 二值图像
  • 索引图像
  • RGB图像

6.2亮度图像

亮度图像中,它的亮度由uint8和uint16表示,在灰度图中,灰度即亮度;在其他图中,亮度是各通道得加权值

6.3二值图像

顾名思义,就0或1组成的图像。但注意Matlab里,要被认为是二值图像的话,数据类型必须是logical类。

七.图像和数据类转换

7.1数据类的转换

单纯的数据类的转换,直接使用对应的函数,即可完成数据类型间的转换:

B = ClassName(A)

类型名是前面那个表格里的。

7.2图像类和类型间的转换


通过一些函数转换,一般来说,对超出部分会直接取新范围的最大最小值,或者说将归一化的值除以新范围的最大值。
就比如这里给出一个亮度图转归一化的灰度图再二值化的过程:

f = imread('.\gray.jpg');
double_f = im2double(f);
gray_f = mat2gray(double_f);
gb_f = im2bw(gray_f, 0.6);
subplot(1,2,1);
imshow(f);
subplot(1,2,2);
imshow(gb_f);


使用RGB的效果也差不多,但有一些差异:

尽管语句支持嵌套,但看起来Matlab是不如Python和C++的OpenCV方便的样子。

八.数组索引

这一部分就类似于Python的数组切片,而且代码都类似。

8.1向量索引

形如这样:

v = [0 1 2 3 4 5];
v(1)

ans显示为ans=0
所以Matlab的数组是从1开始
转置操作符 .'

v = [0 1 2 3 4 5];
v = v.'
%%
v =012345
%%

切片:

  1. matrix(首索引:数量) 同时支持end
v = [0 1 2 3 4 5];
v(1:3)
v(1:end)
%%
ans =0     1     2
ans =0     1     2     3     4     5
%%
  1. 自定义步长:matrix(首索引:步长:数量)
v = [0 1 2 3 4 5];
v(1:2:end)
v(end:-2:1)
%%
ans =0     2     4
ans =5     3     1
%%
  1. 切片矩阵:matrix([matrix])
v = [0 1 2 3 4 5];
v([1 3 5])
%%
ans =0     2     4
%%

8.2矩阵索引

同理,切片支持在高维矩阵中,书上以二维为标准:

  1. 构造与简单的下标访问
v = [0 1 2; 3 4 5; 6 7 8]
v(2,2)
%%
v =0     1     23     4     56     7     8
ans =4
%%
  1. 行列切片
v = [0 1 2; 3 4 5; 6 7 8];
v(1:end, 2)
v(2,:)
%%
ans =147
ans =3     4     5
%%

还可以直接赋值,还不用考虑是否行列对应,这玩意儿会自动转换,甚至标量也可以:

v = [0 1 2; 3 4 5; 6 7 8];
v(:, 2) = [1 2 3];
v(2,:) = 0;
v
%%
v =0     1     20     0     06     3     8
%%

所以可以这样提取图片的roi或者行列扫描线:

f = imread('.\gray.jpg');
roi = f(1:256, 1:256);
line = f(:,256);
subplot(1,2,1);
imshow(roi);
subplot(1,2,2);
plot(line);

8.3选择数组维数

很多操作,其实可以在后面跟上其所操作的维度数:

size(A, dim)

比如该函数,dim=1则是给出size的行数,dim=2则是列数。

九.一些重要的标准数组

其实和Numpy的生成一些特殊矩阵的代码类似,所以直接放图:

十.运算符

也直接放图,和其他编程语言大同小异。所以看一看,记住就行了:







十一.流控制

11.1if语句

if expre1statement1
elseif expre2statement2
elsestatement3
end

这神奇的结构,我能感觉这玩意儿是多少种编程语言的结合体。。。

11.2for语句

for index = start:increment:endstatements
end

例如:

cnt = 0;
for j=0:1:10cnt = cnt + 1;
end
cnt
%%
cnt = 11
%%

11.3While

while exprestatements
end

同时,支持continuebreak

11.4switch

switch exprecase condition1statementcase condition2statementotherwisestatement
end

十二.向量化

前面说Matlab是面向矩阵的语言,看了这部分可能是在编写的时候像Numpy那样,添加了很多优化矩阵的代码,甚至用GPU并行计算矩阵吧,所以单纯用for的效率会远远不及矩阵操作。所以一般来说值得传递也可以给向量或者矩阵,这里就举一个例子:
通过tictoc包裹的语块,可以统计时间。这里给出一个该函数的构造:
f(x,y)=A⋅sin(u0x+v0y)f(x,y)=A\cdot sin(u_0x+v_0y)f(x,y)=A⋅sin(u0​x+v0​y)
假设u0和v0等于1/(4*pi),A=1,图片大小也就是0<=x,y<=256
for循环版

u0 = 1/(4*pi);
v0 = u0;
f = [];
tic
for r = 1:256u0x = u0*(r-1);for c = 1:256v0y = v0*(c-1);f(r,c) = sin(u0x+v0y);end
end
t1 = toc;
imshow(f);
t1

得到图片

和时间t1=0.0051
矩阵版:

u0 = 1/(4*pi);
v0 = u0;
f = []
tic
r = 0:255;
c = 0:255;
[C, R] = meshgrid(c, r);
g = sin(u0*R + v0*C);
t1 = toc;
g = mat2gray(g);
imshow(g);
t1

图一样,而时间缩短到了:t1 = 0.0011

十三.IO流

输出,使用disp( )即可
输入则类似于Python t=input('message out')

十四.单元数组与结构

这个就类似于Python的数组了,啥类型都可以添加,但是这里面的值不会被修改。

c = {'A', 'BC', [1 2], [1 2; 3 4], 5}
c{1}
c{2}
c{3}
c{4}
c{5}
%%
c =1×5 cell 数组{'A'}    {'BC'}    {1×2 double}    {2×2 double}    {[5]}
ans ='A'
ans ='BC'
ans =1     2
ans =1     23     4
ans =5
%%

或者我们可以声明结构体:

S.age = 5;
S.name = 'kanna';
S.matrix = [1 2; 3 4];
T = S;
T.matrix = T.matrix + S.matrix;
T.matrix
%%
ans =2     46     8
%%

Matlab数字图像处理学习记录【1】——准备与基本原理相关推荐

  1. Matlab数字图像处理学习记录【7】——形态学图像处理

    形态学图像处理 一.预备知识 1.1 集合论中的基本概念 1.2 二值图像.集合和逻辑运算符 二.膨胀与腐蚀 2.1 膨胀 2.2 结构元素的膨胀 2.3 strel函数 2.4 腐蚀 三. 腐蚀和膨 ...

  2. Matlab数字图像处理学习记录【9】——表示与描述

    表示与描述 零.前言 一.背景知识 1.1 单元数组与结构 1.1.1 单元数组 1.1.2 结构 1.2 一些基本的M函数 二.表示 2.1 链码 2.2 使用最小周长多边形的多边形近似 2.3 标 ...

  3. Matlab数字图像处理学习记录【2】——亮度变换与空间滤波

    亮度变换与空间滤波 一.背景知识 二.亮度变换函数 2.1函数imadjust 2.2对数和对比度拉伸变换 2.3整合 三.直方图处理与绘图函数 3.1生成并绘制直方图 3.2直方图均衡化 3.2直方 ...

  4. matlab数字图像处理函数,MATLAB数字图像处理学习(二)|常用函数

    以下的学习整理来自<数字图像处理原理与实践(MATLAB版)> im2bw 功能:将索引图象.灰度图像和RGB彩色图像转换为二值图像 调用形式: >BW = im2bw(I,leve ...

  5. 数字图像处理学习记录

    目录 第一章:导论 第二章:数字图像处理基础 第三章:图像变换 第四章:图像增强 ​ 第五章:图像复原与重建 第六章:图像编码与压缩(无内容) 第七章:图像分割 第一章:导论 图像(按图像空间坐标和亮 ...

  6. MATLAB数字图像处理学习笔记

    我们都知道一幅图片就相当于一个二维数组,可以用一个矩阵来表示,而MATLAB可以说就是为矩阵运算而生的,所以学习图像处理,学习MATLAB势在必行! 一. MATLAB基础知识 1. 读取图像 1 % ...

  7. 图像处理怎么学matlab,Matlab数字图像处理学习(1)-亮度变换

    亮度变换函数: 1.imadjust(f,[low_in high_in],[low_out high_out],gamma) gamma = 1时是线性映射,gamma < 1时高亮度区域被压 ...

  8. matlab对于处理数字图像的优点,学习MATLAB数字图像处理经验谈

    学习MATLAB数字图像处理经验谈 学习数字图像处理经验谈 (赵小川) 一.面向应用:层层分解.抓住要点 我们学习数字图像处理的最终目的还是应用,不管是用它来研制产品还是研发项目抑或是研究课题,都要用 ...

  9. 图像处理学习笔记之——Matlab数字图像处理

    Matlab 数字图像处理 1.Matlab R2017b 简介 1.1.Matlab 软件环境 1.1.1.软件界面 1.1.2.Matlab 命令与程序 可以在 >> 提示符后面输入简 ...

  10. 《精通Matlab数字图像处理与识别》一6.2 傅立叶变换基础知识

    本节书摘来自异步社区<精通Matlab数字图像处理与识别>一书中的第6章,第6.2节,作者 张铮 , 倪红霞 , 苑春苗 , 杨立红,更多章节内容可以访问云栖社区"异步社区&qu ...

最新文章

  1. java对象--内部类
  2. C指针原理(16)-C指针基础
  3. hdu 3065 AC自动机
  4. Blueprint 使用手记
  5. 使用taro命令(taro convert)转h5碰到的一些问题
  6. 闰秒对数据库和linux的影响
  7. 软件测试:web渗透测试怎样入门!讲透了...
  8. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(切比雪夫距离+multiset贪心+并查集)
  9. android二维码工程之仿QQ二维码实现
  10. matlab调用refprop完全说明,Matlab调用REFPROP完
  11. rubyonrails test 小记
  12. 8大数据库性能优化方案,YYDS!
  13. LINUX下DNS的查看和配置,Linux系统中查看和修改DNS配置的方法
  14. 金三银四找工作,真没你想的那么难!
  15. 【网络取证篇】suy网络工具包
  16. Android 输入法键盘的显示和隐藏
  17. Win10 如何显示所有任务栏图标,不进行隐藏
  18. 开源硬件论坛,燃烧你的创造力 | COSCon'18 特辑
  19. https://blog.csdn.net/wutianxu123/article/details/82597337
  20. Java计算机毕业设计电影公司网源码+系统+数据库+lw文档

热门文章

  1. Python语言程序设计基础_实验四_函数(一)_答案_通识教育必修课程_上海师范大学
  2. 几乎零基础的git入门级分享
  3. 彻底禁用Microsoft Compatibility telemetry
  4. idear怎么设置自动导包
  5. 微信服务升级——指尖上的超级表格
  6. 4月6日----4月10日二年级课程表
  7. 【观察】易捷行云EasyStack:以可进化的新一代云平台,攀登云计算的“卡瓦格博峰”...
  8. Maven打包war报错
  9. 《西瓜书》学习笔记-目录
  10. 【约束优先级问题二】动态高度cell