Matlab 图像处理基础

一、图像处理的基本操作

1.从图形文件读取图像

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

通过matlab自带的imread读入图像,函数内为图像的路径。如果图片在当前文件夹下,可以通过图片名直接导入。

pic = imread('m.jpg');

2.显示图像

imshow(pic);

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

二、关于图像

1.光的三基色

(1) 光的三基色,就是光的三种基础颜色(Red、Green、Blue),不可以通过其他颜色混合得到。但我们却可以通过将这三种颜色混合获得自然界中绝大部分颜色。

(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,故黑白图像也称灰度图像。灰度图像矩阵元素的取值通常为[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.小结

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。


参考文章:

彩色图像与灰度图像之间的转换

链接:

https://www.cnblogs.com/minisculestep/p/4878894.html

(0)

相关推荐

  • PCL—低层次视觉—关键点检测(Harris)

    除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更敏感.Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很 ...

  • MATLAB的图像实验

    作者:大榕树下  来源:转载https://benzhiwei.blog.163.com/blog/static/3814262420084510385546/  发布时间:2008-5-14 21: ...

  • 如何生成酷炫的背景图片? | 数字艺术 Perlin Noise

    观察下面的动图,你是否对其流动的线条顺滑性感到惊讶?当我第一次看到这张图的时候,第一反应就是,这不就是一张随机的运动图嘛,把每粒子的运动轨迹位置添加一个通过random函数获取数值不就可以了?但是后来 ...

  • 基于灰度-梯度共生矩阵的串联故障电弧特征

    辽宁工程技术大学电气与控制工程学院的研究人员郭凤仪.邓勇.王智勇.游江龙.高洪鑫,在2018年第1期<电工技术学报>上撰文,为了获取非线性负载回路中串联故障电弧的特征,利用自行研制的故障电 ...

  • python进阶—OpenCV之常用图像操作函数说明

    文章目录 cv2.threshold cv2.bitwise_and cv2.bitwise_or cv2.bitwise_not cv2.inRange cv2.resize cv2.adaptiv ...

  • HOG和SIFT图像特征提取简述

    前 言如今,计算机视觉的应用在生活中已随处可见,如人脸识别考勤门禁.全态识别过闸乘地铁等.之所以能大量应用,是因为能解决问题,其本质原理是在数学上找到了一种从具体图像转换到特定数学空间的方法.这里的特 ...

  • (一)OpenCV图像处理基础

    轮廓周围绘制矩形框和圆形框 轮廓周围绘制多边形 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...

  • Matlab图像处理(五)——图像边缘提取

    上一讲小白为小伙伴们带来了如何使用自编函数和自带函数对图像进行滤波,去除图像的噪声.这次小白为大家带来滤波的新用处--边缘提取. 什么是图像边缘 所谓图像边缘(Edlge)是指图像局部特性的不连续性, ...

  • Matlab图像处理(四)——常用滤波的实现

    前面一讲我们已经讲解了滤波的原理和公式,为了让小伙伴更加熟悉基本原理,本将中我们采用了自编写滤波函数和Matlab自带的函数两种方式来实现中值滤波.均值滤波和高斯滤波.小伙伴可以通过点击文末" ...

  • 使用Matlab图像处理(三)——图像滤波原理

    今天小白为大家带来图像滤波的基础原理. 01 - 什么是图像滤波? 小白用一句更简短的话来说:滤波就是去除图像中的噪声. 由于成像系统.传输介质和记录设备等的不完善,数字图像在其形成.传输记录过程中往 ...

  • 图像处理基础:颜色空间及其OpenCV实现

    重磅干货,第一时间送达 作者:Soumyadip Sarkar 编译:ronghuaiyang 转自:AI公园 导读 对图像的颜色空间做了一个概念性的介绍,并通过代码的方式可视化了每种颜色空间的每个通 ...

  • 图像处理基础:图像的灰度变换

    视觉/图像重磅干货,第一时间送达 新机器视觉 最前沿的机器视觉与计算机视觉技术 206篇原创内容 公众号 来源 |  字节流动 灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术 ...

  • Matlab图像处理常用算法源码

    视觉/图像重磅干货,第一时间送达 新机器视觉 最前沿的机器视觉与计算机视觉技术 206篇原创内容 公众号 来源 | CSDN 1.图像反转 I=imread('xian.bmp'); J=double ...

  • Matlab 2018b基础教程复习

    Matlab生成dll使用Python调用+Python安装文件直接生成 RGB转换HSV色彩空间(Python+MATLAB实现) Matlab简单制图功能探索(简单APP制作) Matlab201 ...

  • __02 (修改中...)数学软件2 MATLAB数学运算基础(97-03doc)

    __02 (修改中...)数学软件2 MATLAB数学运算基础(97-03doc)