实验2 基于像素的图像操作.docx

上传人:b****1 文档编号:23284455 上传时间:2023-05-15 格式:DOCX 页数:12 大小:718.45KB
下载 相关 举报
实验2 基于像素的图像操作.docx_第1页
第1页 / 共12页
实验2 基于像素的图像操作.docx_第2页
第2页 / 共12页
实验2 基于像素的图像操作.docx_第3页
第3页 / 共12页
实验2 基于像素的图像操作.docx_第4页
第4页 / 共12页
实验2 基于像素的图像操作.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验2 基于像素的图像操作.docx

《实验2 基于像素的图像操作.docx》由会员分享,可在线阅读,更多相关《实验2 基于像素的图像操作.docx(12页珍藏版)》请在冰豆网上搜索。

实验2 基于像素的图像操作.docx

实验2基于像素的图像操作

实验二基于像素的图像操作

一、实验目的

1、理解图像的数据类型及其之间的转换

2、掌握对图像的像素点进行操作的基本方法。

3、体会图像算术运算处理的过程和处理前后图像的变化。

二、实验原理

1、图像的数据类型

在MATLAB中,数值的运算一般都是采用double型(64位)进行的。

为了节省存储空间,MATLAB为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称为8位型图像。

对于索引图像,数据矩阵中的值指定该像素的颜色种类在色图矩阵中的行数。

当数据矩阵中的值为0时,表示用色图矩阵中第一行表示的颜色绘制;当数据矩阵中的值为1时,表示用色图矩阵中的第二行表示的颜色绘制该像素,数据与色图矩阵中的行数总是相差1。

所以,索引图像double型和uint8型在显示方法上没有什么不同,只是8位数据矩阵的值和颜色种类之间有一个偏差1。

对于灰度图像,uint8表示范围[0,255],double型表示范围[0,1]。

可见,double型和uint8型灰度图像不一样,二者转换格式为:

I8=uint8(round(I64*255));%double转换成uint8

I64=double(I8)/255;%uint8转换成double

使用imread函数读取图像时,imreaad会根据文件中的图像种类作不同的处理。

当文件中的图像为灰度图像时,imread把图像作为无符号整数存入一个uint8矩阵中;imread把索引图的调色板数据转换为double型矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个3维的uint8矩阵中。

2、图像像素间的相邻关系

图像中位于坐标(x,y)的一个像素p,即位于x行y列的像素点有4个水平和垂直的相邻像素,其坐标是:

(x+1,y),(x-1,y),(x,y+1),(x,y-1)

这四个像素集称为p的4邻域。

p的4个对角的相邻像素点坐标是:

(x+1,y+1),(x+1,y-1),(x-1,y+1),(x-1,y-1)

对角的像素点与4个邻域点一起称为p的8邻域。

3、图像的代数运算

图像的代数运算是图像的标准算术操作的实现方法,是两幅输入图像之间进行的点对点的加、减、乘、除运算后得到输出图像的过程。

如果输入图像为A(x,y)和B(x,y),输出图像为C(x,y),则图像的代数运算有如下四种形式:

C(x,y)=A(x,y)+B(x,y)

C(x,y)=A(x,y)-B(x,y)

C(x,y)=A(x,y)*B(x,y)

C(x,y)=A(x,y)/B(x,y)

图像的代数运算在图像处理中有着广泛的应用,它除了可以实现自身所需的算术操作,还能为许多复杂的图像处理提供准备。

例如,图像减法就可以用来检测同一场景或物体生产的两幅或多幅图像的误差。

使用MATLAB的基本算术符(+、-、*、/等)可以执行图像的算术操作,但是在此之前必须将图像转换为适合进行基本操作的双精度类型。

为了更方便地对图像进行操作,MATLAB图像处理工具箱包含了一个能够实现所有非稀疏数值数据的算术操作的函数集合。

下表列举了所有图像处理工具箱中的图像代数运算函数。

表2-1图像处理工具箱中的代数运算函数

函数名

功能描述

Imabsdiff

两幅图像的绝对差值

Imadd

两幅图像的加法

Imcomplement

补足一幅图像

Imdivide

两幅图像的除法

Imlincomb

计算两幅图像的线性组合

Immultiply

两幅图像的乘法

imsubtract

两幅图像的减法

使用图像处理工具箱中的图像代数运算函数无需再进行数据类型间的转换,这些函数能够接受uint8和uint16数据,并返回相同格式的图像结果。

虽然在函数执行过程中元素是以双精度进行计算的,但是MATLAB工作平台并不会将图像转换为双精度类型。

代数运算的结果很容易超出数据类型允许的范围。

例如,uint8数据能够存储的最大数值是255,各种代数运算尤其是乘法运算的结果很容易超过这个数值,有时代数操作(主要是除法运算)也会产生不能用整数描述的分数结果。

图像的代数运算函数使用以下截取规则使运算结果符合数据范围的要求:

超出数据范围的整型数据将被截取为数据范围的极值,分数结果将被四舍五入。

例如,如果数据类型是uint8,那么大于255的结果(包括无穷大inf)将被设置为255。

注意:

无论进行哪一种代数运算都要保证两幅输入图像的大小相等,且类型相同。

三、实验内容及步骤

1、对图像进行像素点操作,需要逐行逐列扫描像素点。

在程序上表现为双重循环的形式,例1是采用像素点相加的方法将图1与图2两个图像相加,结果见图3。

在m程序窗口,输入例1程序,运行并观察结果,理解对图像像素点的操作方法。

例1:

I=imread('rice.tif');

J=imread('cameraman.tif');

[m,n]=size(I);%取图像的尺寸。

m为行数、n为列数

fori=1:

m

forj=1:

n

K(i,j)=double(I(i,j))+double(J(i,j))-70;%两图像的像素点进行相加

end

end

K=uint8(K);%相加的结果转换为uint8型

imshow(K)

例1程序中关键点是,图像数据类型的转换。

imread函数读入灰度图像的数据为无符号整数,而数据要进行代数运算需要转换为双精度型数据。

即语句

double(I(i,j))

运算结束后再转换回无符号8位型数据,确保不影响接下来的操作。

使用语句

uint8(K)

2、两个图像的大小不同时,可以通过放大或缩小某一图像,使两个图像大小相同然后再进行运算。

放大图像的操作有:

创建新的像素点位置和对新位置赋灰度值。

新像素点的灰度值可以赋以邻域像素点的灰度值或双线性内插法获得。

图像缩小可以每隔一行(或一列)删除一行(或一列)来实现。

例2:

使用最近邻域内插法,将256*256像素图(图4'I48_256.bmp')放大到512*512像素图像。

closeall;clearall

x=imread('I48_256.bmp');

y=uint8(zeros(512,512));%创建大小为512*512的空图像,灰度值全0,无符号8位数据

[m,n]=size(x);%取图像的尺寸。

m为行数、n为列数

fori=1:

m

forj=1:

n

ii=2*i;

jj=2*j;

y(ii-1,jj-1)=x(i,j);

y(ii-1,jj)=x(i,j);

y(ii,jj-1)=x(i,j);

y(ii,jj)=x(i,j);%新位置的灰度值是原图的邻域像素的灰度值

end

end

imshow(x)

title('原图256*256')

figure

(2)

imshow(y)

title('放大512*512')

例3:

将256*256像素图(图4)缩小为128*128像素图像。

closeall;clearall

x=imread('I48_256.bmp');

y=uint8(zeros(128,128));

[m,n]=size(y);

fori=1:

m

forj=1:

n

y(i,j)=x(2*i,2*j);%只取偶数行(列)形成新图像

end

end

imshow(x)

title('原图256*256')

figure

(2)

imshow(y)

title('缩小128*128')

思考题1:

编写m程序,实现将大小为128*128的图5(I7.bmp)与大小为256*256的图6(I21_256.bmp)相加,得到类似图7的结果。

图5I7.bmp图6I21_256.bmp

图7两图相加的结果

closeall;clearall

x=imread('I7.bmp');

y=uint8(zeros(256,256));

[m,n]=size(x);fori=1:

m

forj=1:

n

ii=2*i;

jj=2*j;

y(ii-1,jj-1)=x(i,j);

y(ii-1,jj)=x(i,j);

y(ii,jj-1)=x(i,j);

y(ii,jj)=x(i,j);

end

end

imshow(x)

title('原图128*128')

figure

(2)

imshow(y)

title('放大256*256')

I=y;

J=imread('I21_256.bmp');

[m,n]=size(I);

fori=1:

m

forj=1:

n

K(i,j)=double(I(i,j))+double(J(i,j))-70;end

end

K=uint8(K);

imshow(K)

思考题2:

编写m程序,将’cameraman.tif’加重影使其有轮廓模糊的效果。

结果类似图8。

(提示:

1、形成新的图像,由原图向左或向右移动几个像素点。

2、将原图与新图相加,其灰度值要除以2。

J=imread('cameraman.tif');

[m,n]=size(J);%取图像的尺寸。

m为行数、n为列数

K=J

fori=1:

m

forj=1:

n-5

K(i,j)=(double(J(i,j))+double(J(i,j+5)))/2;

end图8重影的cameraman.tif

end

K=uint8(K);%相加的结果转换为uint8型

imshow(K)

结果如下:

四、实验报告及要求

1、按照上述实验步骤把实验结果截图(所有的实验图像标上自己的学号姓名)。

2、回答思考题,写出实现的命令及实验结果截图,分析结果附上文字说明。

3、使用word文档写报告,交电子文档;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1