学习MATLAB GUI工具的程序设计
——图像处理
Craig S. Lent
Department of Electrical Engineering
University of Notre Dame
位图图像是一个二维图像所表示的光的各像素的颜色或强度的数字的阵列。像素的矩形阵列形成的空间变化的强度和/或颜色在图像的平面的近似表示。一个简单的灰度图像仅表示光强度,因此,一个150times;300图像是通过与150行和300列的数字矩阵表示。所谓的RGB彩色图像是使用一个Ntimes;Mtimes;3阵列。三个Ntimes;M个平面中的每一个都代表不同颜色的红,绿和蓝。
无论是在灰度或彩色的情况下,光在给定像素的强度下可以由一个实数(通常介于0和1),或一个整数(通常为0到255之间)来表示。整数表示的优点在于它为计算机的存储器减少了较多的负担。每个实数在MATLAB中需要8个字节(64位)来表示。在范围[0,255]的整数可以通过使用uint(无符号整数)类型,用1个字节(8位)来表示。用于表示每个像素使用的位数就被称为位深——这里,我们通常采取的位深为8。位深为12,14或16的有时也使用。索引颜色的图像对于每个像素都存储一个单号,此外常常有因为空间原因的整数,包括图像文件中的“调色板”,每个整数都相关联一个颜色。
在这里我们只讨论RGB图像。(请参考MATLAB文档中许多其他选项。)作为一个扩展的例子,我们将与从WikiCommons中用JPEG格式处理两个公共域图像:文件Peace_dollar_obverse.jpg和Peace_dollar_reverse.jpg。假设他们是在当前文件夹中。
执行imread命令可以使图像从文件中被读取。此命令可自动识别,这是一个JPEG文件。
dollarFront=imread(Peace_dollar_obverse.jpg);
dollarBack=imread(Peace_dollar_reverse.jpg);
dollarMask=imread(Peace_dollar_obverseMask.jpg);
文件Peace_dollar_obverseMask.jpg中包含了一个面具的硬币,我们将会在看到图像之后再进行说明。
让我们先来看看硬币的正面形象。该图像能够以一个简单的形式作为执行图像命令的图形而显示。
image(dollarFront);
图像是被拉伸的(见图13.9),但是可以通过将坐标轴设置为图像模式来恢复到原始图像的比例。
axis image
来自所有三个文件的图像显示在图13.10中。
我们可以使用size命令从三维阵列dollarFront中得到使用的大小。
[nrows,ncol,ncolors]=size(dollarFront)
nrows =
217
ncol =
220
ncolors =
3
图13.9 一个执行image命令的JPEG图像。注意图像中垂直的坐标以轴向下的方向增长。
图像被存储为一个uint8(8位无符号整数)类型的217times;220times;3的阵列,与最后一个索引确定颜色表。因此,举例来说,图像中的绿信号的强度用该阵列dollarFront(:,:,2)表示。每个元素是一个在0与255之间的整数。在此图像中的(1,1)的像素是白色的,我们可以通过显示三个RGB值探测:
disp([(R,G,B)=( , num2str(dollarFront(1, 1, 1)),...
, , num2str(dollarFront(1, 1, 2)),...
, , num2str(dollarFront(1, 1, 3)), )]);
显示:
(R,G,B)=(255, 255, 255)
黑色像素为(0,0,0);明亮的红色像素为(255,0,0);明亮的绿色像素为(0,255,0);明亮的蓝色像素为(0,0,255)。
请注意,在图13.9和图13.10的显示中有一个不太寻常的方式。坐标系统的原点是在左上角,纵轴指数增加1,图像向下移动距离增加1。这是描述一个位图图像的传统方式:行和列索引从左上角开始,向下和向右增加。它不同于通常的直角坐标系,通常的直角坐标系的纵坐标一般是向上增加的。我们通常喜欢使用笛卡尔坐标系处理图像,所以利用MATLAB中的flipud(翻转上下)命令,逐色翻转每个阵列是很有必要的。
图13.10 从JPEG文件中读取图像,经过image命令和axis image命令建立正确的图像比例。这里每个图像都有217x220个像素点。
for k=1:3
dollarFront(:,:,k)=flipud(dollarFront(:,:,k));
dollarBack(:,:,k)=flipud(dollarBack(:,:,k));
dollarMask(:,:,k)=flipud(dollarMask(:,:,k));
end
这些阵列现在取向,使我们可以将它们放置在x-y平面轴上。我们选择在xisin;[0,6]和yisin;[0,4]的范围内建立坐标轴。
clf
axis([0, 6, 0, 4]);
axis equal
我们分别放置硬币的正面和硬币的背面在该轴的图像。在操作图像重要的是要保持原始图像的纵横比,因此首先计算图像的比例是一个好主意。我们设置图像的宽度为2.5(单位是那些刚创建的轴),这样我们在设定高度时,保持它的纵横比(这里是相同的两个图像),就可以确定其高度。
[ny nx n]=size(dollarFront);
coinAspectRatio=ny/nx;
coinWidth=2.5; % picked just for demo purposes
coinHeight=coinWidth*coinAspectRatio;
现在,image命令用于在其基本形式,它创建一个图像对象,并返回目标。我们将需要设置图像对象的几个属性。
CData:我们设置这个属性的值是像素数据,dollarBack或者dollarFront。这决定了图象对象上显示的像素。
XData和YData:XData的值是一个1times;2的矢量,保持图像中x轴的左下角和右上角(在单位轴上)的坐标。
YData的值是一个1times;2的矢量,保持图像中y轴的左下角和右上角的坐标。我们通常希望选择这些维持图像的纵横比,而不是伸展出来。
Parent:Paren属性的值应被设置为在其上显示的图像的轴心的句柄。在这里,我们将通过gca命令得到句柄;在GUI 中1可能是在句柄结构中使用一个域(例如,handles.photoAxes)。
AlphaData: AlphaData属性的值可随意的设置相同大小为CDATA阵列,它指定图像中每个像素的透明度。值为1表示一个不透明的像素(正常); 0值是该像素是无形的,中间值则是该像素相应部分是半透明的。
我们现在选择的x坐标和y坐标分别为两个硬币的图像的下左角。右上的值将被从硬币的高度和宽度,用我们已经计算出的值来计算。image命令被随后用于创建每个图像对象,它带有一个像素阵列相关联,并设置轴中的位置。
xf=0.25; yf=0; % front of coin
xb=3.25; yb=0; % back of coin
hcoinFront=image(CData, dollarFront,...
Parent, gca,...
XData, [xf, xf coinWidth],...
图13.11硬币的正面和背面图像对象被放置在笛卡尔坐标系内,其中横纵坐标为它们的XData和YData属性值。
YData, [yf, yf coinHeight]);
hcoinBack=image(CData, dollarBack,...
Parent, gca,...
XData, [xb, xb coinWidth],...
YData, [yb, yb coinWidth]);
图像的完整的扩展区域由关闭轴组成的更加清晰。
axis off
如图13.12所示的问题有,我们宁可不显示图像的白角区;他们也可能重叠其它图像。模糊的图像可以被用来有效地除去这些区域。
文件Peace_dollar_obverseMask.jpg通过编辑原始图像文件Peace_dollar_obverse.jpg而创建,在图像处软件程序包中(我用的Photoshop)使用阀值和绘画的组合操作。在这种情况下,目标是让0和1可用于使图像的白色拐角无形的阵列。大部分uint8类型217times;220times;3 的dollarMask阵列在这一点上的值是0或255(黑色或白色)。我们把它变成一个217times;220的double类型的0和1的阵列,使用合理的阵列运算,以便得到正确的数值填充AlphaData属性。
图13.12 这两个硬币图像以关闭的坐标轴显示。这表示图像的角落可能存在着问题。
图 13.13 相同的图像如图13.12所示,但现在随着AlphaData的掩码,应用于图像的透明角落。
dollarMask=double(dollarMask(:, :, 1)gt;100); % make 0s and 1s.
set(hcoinBack, AlphaData, dollarMask);
set(hcoinFront, AlphaData, dollarMask);
结果如图13.13总所示。
一个硬币可以顺利进入到由在一个部分重叠而其他更新的XData和YData的值的循环中。这种供应还显示掩码是如何有效地消除角落,使得可以看到这样一个硬币在它旁边。需要注意的是,一个图像目标通过它的句柄是可以操作的——这个像素阵列仅仅是由CData对象的属性决定。
Nx=50;
xshift=linspace(0, 2.0, Nx);
yshift=0.2*xshift;
for ix=1:Nx
set(hcoinFront, XData,...
[xf xshift(ix), xf xshift(ix) coinWidth])
图13.14 移动左边的硬币与右边的硬币重叠,表明AlphaData的掩码允许一个图像通过另一个图像显示。
图13.15 相同的图像如图13.14所示,但由于额外的掩码,而在顶部的硬币上创建了一个洞。
set(hcoinFront, XData,...
[xf xshift(ix), xf xshift(ix) coinWidth])
drawnow
end
图13.14显示了图像在运动完成后的效果。
下面的代码构造更复杂的掩码,使用按位AND操作符amp;,来创建一个额外的洞在顶部硬币上,如图13.15所示。
[X, Y]=meshgrid (linspace (0, ny, ny ), linspace (0, nx, nx));
R=sqrt (( X-ny / 2).circ;2 ( Y-nx / 2).circ; 2);
holeMask= double ( (Rgt; nx / 7) amp; ( dollarMask gt; 0.5) );
set ( hcoinFront, AlphaData, holeMask );
这图像是在另一个的顶部由坐标轴的Children的属性值来确定的。该属性的值是包含每个子对象的句柄,这里只是两个硬币的图像对象的列向量。该顺序可以翻转,其他硬币图像移动到顶部可通过以下命令:
set (gca, children, flipud(get (gca, children) ) );
图像对象,如补丁对象,可以对用户鼠标点击和拖拽,如第12.8节所述。
表面上放置图片对象
surf命令,在239页介绍了,可以用来创建一个表面可以显示位图的图像对象。FaceColor属性应该设置为“texturemap”,同时CData属性应设置为表示图像的Ntimes;Mtimes;3的位图阵列。位图阵列的大小不需要对应于在x和y的网格。通常也是可以取得EdgeColor属性设置为“无”。下面的示例程序将硬币图像映在波浪形表面上。
% coinWavePlot
% place image on surface
% Author: Trillium Fortnight
%% set parameters
N=100;
lambda=1;
%% make grid
y=linspace(0, 1, N);
z=linspace(0, 1, N);
[X, Z]=meshgrid(y, z);
lt;
剩余内容已隐藏,支付完成后下载完整资料
英语原文共 13 页,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[286810],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、开题报告、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 评估 HbA1c 与心血管疾病的线性和非线性关联:孟德尔随机化研究外文翻译资料
- 泰国北部清莱农村老年人的睡眠质量及相关因素外文翻译资料
- 巴西青少年的孤独感及其相关因素:2015年全国青少年校园健康调查结果外文翻译资料
- 美国成年人身高与高血压的关系:2007-2018年全国健康与营养调查分析外文翻译资料
- 日本年轻女性的人体测量学、身体组成和体型特征:对隐性肥胖综合征和肌少症的诊断标准外文翻译资料
- 新冠肺炎维度与美国大学生的抑郁和焦虑相关:2020年健康心理调查的结果外文翻译资料
- 衡量医生的信任:对公共政策影响的范围审查审查外文翻译资料
- 韩国青少年网络游戏类型与网络游戏障碍高风险性的关系外文翻译资料
- 大学生职业生涯规划对本科生成长的作用分析外文翻译资料
- 通过社会生态学理论的视角来评估在线医疗服务的利用情况 社会生态学理论和信息-动机-行为技能模型进行评估:来自中国的证据外文翻译资料