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

2019-04-14 20:50

如:先获取r颜色的二维矩阵:j=i(:,:,1); 再运行:imhist(j); 4. 获取像素点信息

pixval,在使用image或imshow显示图像后,在执行pixval指令,便可以读取光标所指向的像素点的坐标和灰度值;如果按住鼠标,在图像中拖曳,便可以显示光标所移动的距离。

再次运行pixval则是关闭获取像素点信息。 5. 求矩阵的规模

D=size(i),函数size用来求矩阵的规模。如果I是n×m的矩阵,则D是包含两个元素的向量:D=[n, m ];同样道理,如果I是n×m×3的矩阵,则D=[n,m,3]。如果我们事先知道矩阵的维数,也可以直接用这样的方法求得矩阵的规模:[n,m]=size(i)或[n, m, k]=size(i)等。 6. 数据类型转换

i=uint8(X),这个函数实现将矩阵X中的所有元素转换为无符号8位整形数据,把转换的结果保存在矩阵I中。这个函数对所有类型的数据都适用,转换后数值都落在0到255之间。

i=double(X),这个函数与uint8()相似,实现的功能是将矩阵X中的所有元素转换为double类型(16位双精度类型)。 五、 实验过程

根据分析,图像中位于轮廓线上的点,它与其相邻的点的灰度值差有一定的跳跃,故通过值的对比,就可以将那些边缘点提取出来。

考虑到图像边框上的像素点对于轮廓线获取的结果影响不大,且为了代码的简单实用,首先去掉图像的边框上的所有像素点,即:去掉灰度值矩阵的第一行、第一列、最后一行和最后一列。这样做的好处是显而易见的,因为可以保证每一个待比较的点其周围都有8个供比较的点,如图示:

在算法中,将中心被检测点依次与其上下、左右、左上、右下,和右上、左下8个点做比较,若差值大于规定值,则该检测点就是轮廓线上的点,反之不是。算法关键的地方是对IMREAD生成的矩阵进行了非线性变换。

算法流程如下:

首先,将这个矩阵从8位无符号型变成双精度的数值存储;

然后才能进行下一步的将其每个值都除以255,这样就把每个数值都调整为0~1之间的小数;

再用正弦sin函数将这些值做变换,并取求得的结果放大40倍。这样一来,本来是在0~255之间的正整数,就被变换到0~1之间的小数,然后再离散成0~40之间的双精度数值。其目的是为了在进行比较灰度值的时候,方便自定义各种差值。

最后,用户给定一个差值,根据这个值来比较检测点与其周围8个点的灰度值,若大于给定差值,则认为检测点位于轮廓线上,否则,不在轮廓线上。

灰度图的源代码(.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矩阵对应点置白色。

彩色图提取轮廓线示例:

注:n值为1.6时, 1)由红色矩阵提取的轮廓线;2)由绿色矩阵提取的轮廓线; 3)由蓝色矩阵提取的轮廓线。 六、 结论与应用

在前面的算法中,在逐行逐列扫描比较各个象素点是否属于轮廓线上的点的过程中,事先预设除去边框的所有点,这是为了得到比较精简实用的算法。否则,算法会相对复杂,首先需将图像的边框引入,在算法中便多了四条特殊的线和四个特殊点,就是上下左右的边线及图像的四个顶点。拿四个顶点而言,可供它们进行比较的参考点只有三个,而且对于每个点而言,三个参考点的位置都不相同,这样就造成了算法的累赘冗余。同理,边线也是,边线上的点只有五个参考点,也是各边方向不同,需要大量相似的代码。

实验证明,提取轮廓线时,加上边框与不加边框的区别非常不明显,故采用后者的精简算法。在灰度图和彩色图的算法中,对读取生成的图片数据矩阵进行了线性变换,为的是更好的调节自定义强度值的差值,从而得到令人满意的结果。选择三角函数sin,用其进行变换后,可以保证结果值都落到0~1之间,从而控制扩大后的数值都在0~40的范围。其实这个函数也可以使用其他离散函数,譬如log,它的离散作用更加明显,可以将值都变换到[0,+?)区间上。)

由于噪声和模糊的存在,轮廓线可能会变宽或在某些点处发生间断。在算法中,发现图片出现断点,可以通过减小n值来提高轮廓线的精度从而减少断点。但是,轮廓线变粗的同时,弊处是也使原有的清晰的其他线条变得更加粗,甚至出现了模糊的散点。为此,只能寻找一个合适的n值,使断点不至于太多,轮廓线也不会太黑糊。

在MATLAB的图像处理中,导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值比较高,因此可将这些导数值作为相应点的边界强度,通过设置门限的方法,提取边界点集。

一阶导数与是最简单的导数算子,它们分别求出了灰度在x和y方向上的变


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

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

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

马上注册会员

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