MATLAB 软件使用简介 轮廓线提取 实验2 图像轮廓线提取技术 实验(5)

2019-04-14 20:50

绿 G 蓝 B 0 0 255 0 0 255 255 0 0 255 255 255 255 255 0 0 128 128

2.灰度图提取轮廓线的提取

函数IMREAD 用来读取图形文件。

A=IMREAD(FILENAME,FMT)格式用以读取由字符串FILENAME所指定的一张灰度图或者彩色图,而字符串FMT用以详细说明该文件的格式。如果该文件不在当前MATLAB的工作目录或MATLAB其他指定路径中,需指明该图在系统中的完整路径。

IMREAD返回该图像的数据值给数组A。如果该文件包含的是一张灰度图,A是一个二维(M N)的数组。如果该文件包含的是一张彩色图,A则是一个三维(M N 3)的数组。其返回数组的类型是根据该文件所使用的格式而定的。

就多数文件格式,返回的彩色图像数据使用的RGB色彩空间。但就TIFF文件而言,IMREAD可以返回使用RGB,CIELAB,ICCLAB,或者CMYK色彩空间的色彩数据。如果该彩图使用CMYK色彩空间的话,那A就是一个(M N 4)的数组。在IMREAD所支持的各图像文件格式中,象素的储存方法是用每个色彩平面使用8位或更少位的。当文件的每个象素点只包含一位时,输出的数组(A或X)是逻辑的。而当其读入其他每点使用8位或更少位的图像时,输出的类型是8位无符号整型的。IMREAD也支持读取每象素16位的BMP,PNG,JPEG,和TIFF位图格式,还有12位的JPEG格式。对于12位的JPEG和16位的JPEG,PNG,和TIFF图像格式,输出的数组(A或X)是16位无符号整型的;而对于16位的BMP位图,输出则是8位无符号整型。详见下表: 文件数据类型 1位(bit) 8位(或更少) 12位 16位(JPEG,PNG,TIFF) 16位(仅BMP) IMREAD返回的数组类型 逻辑型 8位无符号整型 16位无符号整型 16位无符号整型 8位无符号整型

IMAGE用来显示图片或者图形。 IMAGE(C)将矩阵C显示为一幅图像。C中的每一个元素指明了该图中对应点的颜色。矩阵C可以是M N 维或者M N 3维的,它的数据可以是双精度,8位无符号整型,或者16位无符号整型的。

当C是一个2维的M N矩阵,C中的元素被作为当前调色板COLORMAP的索引从而用之来决定颜色。该目标图片的C数据变换的值决定了选择调色板的

方式。作为“直接”的C数据变换(默认),其C中的值被视作调色板的索引(1-双精度,0-8位无符号整型或者16位无符号整型)。作为“比例”C数据变换,其C中的值首先根据轴的比例进行转换而后再被作为调色板的索引。当C是一个3维M N 3的矩阵时,在矩阵C(:,:,1)中的元素被解释为红色的强度值,在矩阵C(:,:,2)中的为绿色的强度值,矩阵C(:,:,3)中为蓝色的强度值,此时,该图的C数据变换的属性被忽略。那些包含双精度数据的矩阵,色彩的强度值变化从[0.0 , 1.0]。那些8位和16位无符号整型的矩阵,色彩的强度值范围是[0 , 255]。IMAGE(C)把元素C(1,1)的中心放置在坐标系中点(1,1)的位置,把元素(M,N)放置于坐标轴的点(M,N),然后绘制每一

个直线点的长和宽都为1单元。所以,该图像边框实际向外延伸了0.5单元,占据[0.5 N+0.5 0.5 M+0.5],而且图像的每一个象素点都位于1~M或1~N的整数坐标之间。调色板与数组类型关系如下:

图像类型 双精度数据 (双精度数组) 图像由2维的MxN整数数组存贮; 调色板是Mx3的数组,其范围于[0,1]的浮点数 8位(8位无符号整型数组) 16位(16位无符号整型数组) 图像由2维的MxN整数数组存贮,8位无符号整型范围于[0,255],16位范围于[0,65535];调色板同左 索引的 (调色板) 真彩色(RGB) 图像由3维的MxNx3的[0,1]之间 的浮点数数组存贮 图像由3维的MxNx3的8位无符号 整型数[0,255]或者16位无符号 整型[0,65535]的数组存贮 SIZE 用以求数组的大小 D = SIZE ( X ),对于M N的矩阵X,它返回一个含有两个元素的行向量D = [ M,N ],其M和N分别代表该矩阵的行数和列数。对于矩阵X而言,[ M,N ]=SIZE ( X )返回行和列数。灰度图经过IMREAD函数读取后,生成的是一个2维(M N)矩阵,其每一个数值都代表着原图片中对应象素点的色彩的灰度值,范围[0,255],并且都是正整数。其中,0表示黑,255表示白。位于轮廓线上的点,它与其相邻的点的灰度值差有一定的跳跃,故通过值的对比,就可以将那些边缘点提取出来。

但是,为了代码的简单实用,首先我去掉了图像的边框上的所有象素点,即:去掉灰度值矩阵的第一行、第一列、最后一行和最后一列。这样做的好处是显而易见的,因为可以保证每一个待比较的点其周围都有8个供比较的点,如图示:

在算法中,将中心那个点依次与其上下、左右、左上、右下,和右上、左下8个点做比较,若差值大于规定值,则其就是轮廓线上的点,反之不是。算法关键的地方是对IMREAD生成的矩阵进行了非线性变换。首先,将这个矩阵从8位无符号型变成双精度的数值存储;然后才能进行下一步的将其每个值都除以255,这样就把每个数值都调整为0~1之间的小数;再用正弦sin函数将这些值做变换,并取求得的结果放大40倍。这样一来,本来是在0~255之间的正整数,就被变换到0~1之间的小数,然后再离散成0~40之间的双精度数值。其目的是为了在进行比较灰度值的时候,方便自定义各种差值。灰度图的源代码(.m文件)如下:

function graydrawout(pix,n) %灰度图的轮廓线提取 A=imread(pix); %读取指定的灰度图

[a,b]=size(A); %a,b分别等于矩阵A的行数和列数

B=double(A); %将矩阵A变为双精度矩阵 D=40*sin(1/255*B); %将矩阵B进行线性变换

T=A; %新建与A同等大小矩阵 for p=2:a-1 %处理图片边框内的象素点 for q=2:b-1

if (D(p,q)-D(p,q+1))>n|(D(p,q)-D(p,q-1))>n| (D(p,q)-D(p+1,q))>n|(D(p,q)-D(p-1,q))>n| (D(p,q)-D(p-1,q+1))>n|(D(p,q)-D(p+1,q-1))>n| (D(p,q)-D(p-1,q-1))>n|(D(p,q)-D(p+1,q+1))>n

T(p,q)=0; %置边界点为黑色 else

T(p,q)=255; %置非边界点为白色 end; end; end;

subplot(2,1,1); %将窗口分割为两行一列,下图显示于第一行 image(A); %显示原图像 title('灰度图原图'); %图释

axis image; %保持图片显示比例 subplot(2,1,2); %下图显示于第二行

image(T); %显示提取轮廓线后的图片 title('提取轮廓线'); %图释

axis image; %保持图片显示比例

注释:pix-为要提取轮廓线的灰度图名(带路径),由单引号括住。

n-自定义的灰度值差值,超过该值就是轮廓线上的点,反之不然。

这是一个最重要的参数,通过调节它的值,修整轮廓线的效果,取范围在0~40之间的任何有理数。

A-MATLAB读取原图片后返回的数据矩阵,2维(M N ) T-新建的与A矩阵同等行列数的矩阵,待放入比较后结果

代码的主体是if-else-end部分,我们来分析它。其原理就是将中心点与其周围的8个点依次比较,发现有一个差值大于自定义的值时,就判断其为轮廓线上的点并将之置为黑色;若其与周围8个点的比较值都小于自定义值时,则其不在轮廓线上,置白色。灰度图提取轮廓线示例(n=20):

3. 彩色图提取图像轮廓线

彩色图片经过IMREAD函数读取后,由于它的每一个象素点都是由红、绿、蓝三色的强度值一起定义其颜色的,所以,生成的是一个3维的(M N 3)矩阵。矩阵平面(:,:,1)代表对应象素点的红色强度值,矩阵平面(:,:,2)是绿色强度值,矩阵平面(:,:,3)则是蓝色强度值。在每一个矩阵平面中强度值的范围是[0,255]的正整数。位于轮廓线上的点,它的红、绿、蓝三色的强度值与其周围的点必然有一定的差值,也正式利用这些差值的比较,可以将那些位于边缘的点提取出来。 在算法上,彩色图与灰度图不同的是,彩图的每一个单色矩阵可以单独用来判定该点是否位于轮廓线上。其算法与灰度图的原理非常相似。 在彩色图的算法中,加入了对判定矩阵的选择,即提供使用者自由选择用图片的哪一个单色矩阵进行轮廓线提取。因为根据图片本身的特点,选择更适合于进行提取的矩阵,其效果是十分不同的,在下面的讨论中将会再次提到这个问题。

算法关键的地方同样是对IMREAD生成的矩阵进行了线性变换。首先,将这个矩阵从8位无符号型变成双精度的数值存储;然后才能进行下一步的将其每个值都除以255,这样就把每个数值都调整为0~1之间的小数;再用正弦sin函数将这些值做变换,并取求得的结果放大40倍。这样一来,本来是在0~255之间的正整数,就被变换到0~1之间的小数,然后再离散成0~40之间的双精度数值。其目的是为了在进行比较单色强度值的时候,方便自定义各种带小数的差值。彩色图轮廓线提取的源代码(.m文件)如下: function colordrawout(pix,n) %彩色图片轮廓线提取函数

A=imread(pix); %读取指定彩色图片 B=A(:,:,1); %红色强度值矩阵 C=A(:,:,2); %绿色强度值矩阵 D=A(:,:,3); %蓝色强度值矩阵

for i=1:3 %依次从三个矩阵中提取轮廓线 if i==1 %从红色矩阵提取 E=B;

else if i==2 %从绿色矩阵提取 E=C;

else E=D; %从蓝色矩阵提取 end; end;

H=double(E); %将选择的矩阵变为双精度矩阵 F=40*sin(1/255*H); %进行非线性变换

[k,j]=size(B); % k,j分别为矩阵D的行数和列数

T=A;

for p=2:k-1 for q=2:j-1

if (F(p,q)-F(p,q+1))>n|(F(p,q)-F(p,q-1))>n| (F(p,q)-F(p+1,q))>n|(F(p,q)-F(p-1,q))>n| (F(p,q)-F(p-1,q+1))>n|(F(p,q)-F(p+1,q-1))>n| (F(p,q)-F(p-1,q-1))>n|(F(p,q)-F(p+1,q+1))>n

T(p,q,1)=0;T(p,q,2)=0;T(p,q,3)=0; %置边界点黑色 else

T(p,q,1)=255;T(p,q,2)=255;T(p,q,3)=255;%置非边界点白色 end; end; end;

subplot(2,2,i+1); %将窗口分割为两行两列,下图显示于第i+1位置 image(T); %显示轮廓线 title(i); %图释

axis image; %保持图片显示比例 end;

subplot(2,2,1); %下图显示于第1位置 image(A); %显示原彩色图片 title('彩色图原图'); %图释

axis image; %保持图片显示比例

注释:pix-为要提取轮廓线的灰度图名(带路径),由单引号括住。

n-自定义的强度值值差值,超过该值就是轮廓线上的点,反之不然。 这是一个最重要的参数,通过调节它的值,修整轮廓线的效果 范围为0~40之间的任何有理数。

A-MATLAB读取原图片后返回的数据矩阵,3维(M N 3) T-新建的与A矩阵同等行列数的矩阵,待放入比较后结果。 代码中加入的部分是对单色强度值矩阵的选择。从比较中可以看出,选择彩色图片中最大程度的颜色矩阵,可以提高提取轮廓线的效果。譬如:图片以红色为主,就选择1-红色矩阵。 代码的主体同样是if-else-end部分。其原理仍是将中心点与其周围的8个点依次比较,发现有一个差值大于自定义的值时,就判断其为轮廓线上的点并将T矩阵中对应点置为黑色;若其与周围8个点的比较值都小于自定义值时,则其不在轮廓线上,T矩阵对应点置白色。

彩色图提取轮廓线示例:


MATLAB 软件使用简介 轮廓线提取 实验2 图像轮廓线提取技术 实验(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高二下家长会物理老师的发言稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: