Matlab 简单图像处理

一、图像处理的基本操作

1.从图形文件读取图像

pic = imread('C:\Users\Good\Pictures\m.jpg');

通过 matlab 自带的 imread 读入图像,函数内为图像的路径。如果图片在当前文件夹下,可以通过图片名直接导入。pic = imread('m.jpg');

2.显示图像

imshow(pic);

通过上面的简单操作,我们已经可以在 matlab 中读入图像文件,并显示出来。接下来我们要对图像本身的一些问题进行原理性的讲述。

二、关于图像

1.光的三基色

(1) 学过高中物理的我们都听说过 “光的三基色”,光的三基色,就是光的三种基础颜色(R 红色、G 绿色、B 蓝色),不可以通过其他颜色混合得到。但我们却可以通过将这三种颜色混合获得自然界中绝大部分颜色。

(2) 在 matlab 中,颜色的表示就是通过显示 RGB 相应的数值来表示颜色。通常情况下,RGB 各有 256 级亮度,用数字表示为从 0、1、2… 直到 255,共 256 级。每个基色分量直接决定显示设备的基色强度。

imfinfo('C:\Users\Good\Pictures\m.jpg') %获取图像文件的信息
size(pic)
图像文件信息

可以看出图像在 matlab 中就是一个 Height ? Width ? 3 的一个 uint8 类型的矩阵,其中 Height、Width 是图像的大小,也就是像素点。一个个像素点上其中 3 即为 RGB 的三个数值,用来表示该像素点的颜色,通过像素点的坐标来定位到像素点。

R = pic(:,:,1);
G = pic(:,:,2);
B = pic(:,:,3);
图像中的像素点

2.灰度图像

灰度是描述灰度图像内容的最直接的视觉特征。它指黑白图像中点的颜色深度,范围一般从 0 到 255,白色为 255,黑色为 0,故黑白图像也称灰度图像?;叶韧枷窬卣笤氐娜≈低ǔN?[0,255],因此其数据类型一般为 8 位无符号整数,这就是人们通常所说的 256 级灰度。

灰度图像

3.彩色图像转化成灰度图像

rgb2gray是 matlab 的内置函数,用来将 RGB 图像或颜色图转换为灰度图。灰度图的图像矩阵是一个 Height ? Width ? 1 的一个 uint8 类型的矩阵。也就是将三基色RGB的数值转化为一维的灰度值,便于图像处理。彩色图像转换为灰度图像时,需要计算图像中每个像素有效的亮度值,其计算公式为:Y = 0.3R + 0.59G + 0.11B

图像矩阵
turn_pic = rgb2gray(pic);
pic = double(pic);  %需要转化类型,不然计算结果可能不同
turn_pic(1,1)
0.3*pic(1,1,1) + 0.59*pic(1,1,2) + 0.11*pic(1,1,3)

4.灰度图像转化为彩色图像

将灰度图像转换为彩色图像,称为灰度图像的伪彩色处理。

伪彩色处理技术的实现方式有很多,如:灰度分割法、灰度级-彩色变换法、滤波法等等。以下采用的是灰度级-彩色变换法,这是将来自传感器的灰度图像送入三个不同特征的 R、G、B 变换器,然后将三种变换器的不同输出分别送到彩色显示器进行显示的技术。

gray2rgb函数可以将灰度图转化为彩色图,不过需要下载相关文件,需要的话可以自行搜索,而且执行效率很低。

映射关系如下,其中 R(x,y)、G(x,y)、B(x,y) 分别表示 R、G、B 的颜色值,f(x,y) 表示特定点灰度图像的灰度值,f 是所选灰度图像的灰度值。

5. 二进制图像

二进制图像也称为二值图像,通常用一个二维数组来描述,1 位表示一个像素,组成图像的像素值非 0 即 1,没有中间值,通常 0 表示黑色,1 表示白色。二进制图像一般用来描述文字或者图形,其优点是占用空间少,缺点是当表示人物或风景图像时只能描述轮廓。一般我们可以通过设置阈值来进行二进制图像转化,matlab 中可以利用im2bw从灰度、索引、RGB 图象创建二值图。

6.索引图像

索引图像是一种把像素值直接作为 RGB 调色板下标的图像。在 Matlab 中,索引图像包含一个数据矩阵 X 和一个颜色映射(调色板)矩阵 map。数据矩阵可以是 8 位无符号整型、16 位无符号整型或双精度类型的??梢酝ü韵麓攵运饕枷窈?RGB 图像进行转化:

IND = rgb2ind(pic,n);  % pic为RGB图像矩阵,map为颜色映射矩阵,最多包含n个颜色。n必须小于或等于 65,536。
RGB = ind2rgb(pic,map);  % pic为索引图像矩阵,map为颜色映射矩阵

7.小结

图像类别 英文名称 英文缩写
RGB rgb rgb
灰度 gray gray
索引 index ind
二进制 binary bin

2 英文 two 和 to 发音相同,所以很多转换类函数都用 2 来命名而非 to。比如number to string, 不是命名为numTostr而是num2str。记住英文缩写,我们就可以灵活使用各种函数进行图像转换。

三、利用插值法对图像进行放大处理

1.二维插值

二维插值是对两个变量的函数z = f(x,y)进行插值
求解二维插值的基本思路是:

常见的二维插值可以分为两种:网格结点插值和散乱数据插值。
二维插值处理图片,可以使放大后的图片的失真率降低,提升图片放大后的显示效果。

2.插值问题的出错总结

pic = imread('C:\Users\Good\Pictures\m.jpg');
turn_pic = rgb2gray(pic);
[m,n] = size(turn_pic);
x0 = 1:m;
y0 = 1:n;
x = 1:0.5:(m+0.5);
y = 1:0.5:(n+0.5);
z = interp2(x0,y0,turn_pic,x,y,'cubic');

错误提示

出错原因:x0, y0, X, Y 都是 double 类型的数据,但是 turn_pic 是 uint8 类型的数据。
错误修改turn_pic = double(turn_pic);
修改后运行

错误分析

像这样的插值问题,最怕的就是矩阵的 size 不对应,参照我们插值时可以传入 meshgrid 生成的网格数据,我们不难知道,interp2 的插值方式,内部会自己利用 meshgrid 方式处理传入的数据。但我们知道 meshgrid 方式生成的网格数组与原数据矩阵 size 相反,所以要注意这个 size 问题。以代码为例:

[m,n] = size(turn_pic);
x0 = 1:m;
y0 = 1:n;

传入的 x0,x,y0,y 分别对应的是图像矩阵的行和列,利用 meshgrid 生成的网格面都与 turn_pic 的 size 正好相反。所以我们初始定义 x,x0 对应列,y,y0 对应行,这样就可以避免 size 错误。

正确代码

pic = imread('C:\Users\Good\Pictures\m.jpg');
turn_pic = rgb2gray(pic);
turn_pic = double(turn_pic);
[m,n] = size(turn_pic);
x0 = 1:n;
y0 = 1:m;
x = 1:0.5:(n+0.5);
y = 1:0.5:(m+0.5);
[X,Y] = meshgrid(x,y);
z = interp2(x0,y0,turn_pic,X,Y,'cubic');
z = uint8(z);
imshow(z);

效果图

3.网格点数据的生成

在 matlab 中,进行三维图像的绘制,一般要构造二维的网格面,再通过二维的网格面对应 z 值,绘制出三维的图像。

一般,我们常用 meshgrid 来构建二维的网格面。

meshgrid:二维和三维网格
用法:[X,Y]=meshgrid(x,y)
另一种用法[X,Y]=meshgrid(x) 这等价于 [X,Y]=meshgrid(x,x)
其中 x 为 n 维向量,y 为 m 维向量,x, y 为 m?n 维的矩阵。它用于产生 “二维变量的网格”。
下面举例说明:

x = 1:4;
y = 1:3;
[X,Y] = meshgrid(x,y);

ndgrid:N 维空间中的矩形网格

用法:
[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn) 复制网格向量 x1,x2,...,xn 以生成 n 维满网格。
[X1,X2,...,Xn] = ndgrid(xg) 指定对所有维度使用单一网格向量 xg。您指定的输出参数的数目决定输出的维度 n。

两者的区别与联系
ndgrid 支持从 1 维到 n 维,而 meshgrid 仅仅限制于 2 维和 3 维。在 2 维以及 3 维中,两个函数的坐标输出是一样的,[X,Y,Z] = meshgrid(x,y,z) 等效于 [Y,X,Z] = ndgrid(y,x,z),不同的地方在于输出数组的形状不一样。例如:x 长度为 m,y 长度为 n,meshgrid 生成的二维网格 size 为 n?m,而 ndgrid 为 m?n。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容