matlap图像处理函数学习---bwboundaries

在对肺部CT图像进行处理过程中,需要初步提取肺实质区域。用到了bwboundaries函数进行边界标记。
clear
clc
I = imread('IMG-0025-00001.jpg');%read pic
p=imcomplement(I);
se=strel('square',2);
se1=strel('disk',2);
bw=imerode(p,se);
[L,N]=bwlabel(bw,4);
s = regionprops(L,'Area');
bw1=ismember(L,find([s.Area]>=10000 & [s.Area]<=50000  ));
bw2=imerode(bw1,se);
%bw2=imdilate(bw2,se1);
bw2=imerode(bw2,se);
bw2=imdilate(bw2,se1);
%bw2 = bwmorph(bw2,'thin',Inf); 
%bw2 = imclearborder(bw2);
%bw2=imerode(bw2,se1);
[B,L]=bwboundaries(bw2);
bw3=bwperim(bw2);%boundaries 
figure;subplot(2,3,1);imshow(p);title('binaryinvert');
subplot(2,3,2);imshow(bw);title('beforeimeroderegionpops');
subplot(2,3,3);imshow(bw1);title('afterimerodese>10000<50000');
subplot(2,3,4);imshow(bw2);title('imdilatese');
subplot(2,3,5);imshow(bw3);title('boundaries');
subplot(2,3,6);imshow(label2rgb(L, @jet, [.5 .5 .5]))
       hold on
       for k = 1:length(B)
           boundary = B{k};
           plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 1)
       end
       
  ;title('contur');

使用MATLAP版本为7.0英文版,所以目录及文件中都不能有中文。图像最好放在源文件同一目录中。目录分布



原始图像(经过阈值处理后)我们要做的是提取图像中两个大的黑色区域,分别为左右肺实质。而中间的类圆形黑色区域为肺气管,需要去除。至于白色区域为胸腔骨骼等组织。:



处理后结果:

代码部分解释,英文版本下不能直接复制粘贴,会出现乱码。%表示注释部分,为matlap特定:

</pre><pre name="code" class="html">clear
clc
I = imread('IMG-0025-00001.jpg');%读取图片
p=imcomplement(I);%进行图像二值反转,将黑白两部分颜色反转
se=strel('square',2);%设定一个2*2矩形模板,用于进行形态学开闭运算,进行边界平滑处理,可在matlap中使用help strel命令查看相关方法使用
se1=strel('disk',2);%设定一个直径为2的圆形模板,功能同上
bw=imerode(p,se);%进行形态学腐蚀操作,该步骤的目的是将气管和肺实质间距离增大。这样在后面进行区域连通标记时不会出现两者粘连而无法去除气管的情况,
%可根据需要进行模板设定,为了不使提取边界误差较大,使用2*2矩形模板
[L,N]=bwlabel(bw,4);%进行区域连通标记,为4邻域区域标记,因为8连通下边界会出现不均匀情况。L为返回的二维数组,N为区域个数。
s = regionprops(L,'Area');%进行标记区域面积计算。<span style="font-family: Arial, Helvetica, sans-serif;">可在matlap中使用help </span><span style="font-family: Arial, Helvetica, sans-serif;">regionprops</span><span style="font-family: Arial, Helvetica, sans-serif;">命令查看相关方法使用</span>
bw1=ismember(L,find([s.Area]>=10000 & [s.Area]<=50000  ));%去除区域标记中面积较小的气管,以及面积较大的背景部分。从而得到肺实质初始区域
bw2=imerode(bw1,se);%对边界进行腐蚀操作,
bw2=imerode(bw2,se);
bw2=imdilate(bw2,se1);<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">%对边界进行膨胀操作,</span>
%经多次腐蚀膨胀操作目的是为平滑边界。
[B,L]=bwboundaries(bw2);%边界提取,返回一个含有n个单元数组 。B is a P-by-1 cell array, where P is the number of objects  and holes.
bw3=bwperim(bw2);%边界像素提取。该步的目的只是作为视图查看进行该操作的结果。对整个实验无关紧要。
figure;subplot(2,3,1);imshow(p);title('binaryinvert');%显示二值反转后的图像,其中,sulplot(2,3,1)表示二行3列第一个图片。即总共6张图片,这是第一张subplot(2,3,2);imshow(bw);title('beforeimeroderegionpops');%显示二值反转后的图像
subplot(2,3,3);imshow(bw1);title('afterimerodese>10000<50000');%显示去除气管和背景后的图片
subplot(2,3,4);imshow(bw2);title('imdilatese');%显示边界平滑后的图像
subplot(2,3,5);imshow(bw3);title('boundaries');%显示边界像素提取后的图像
subplot(2,3,6);imshow(label2rgb(L, @jet, [.5 .5 .5])) %彩色显示边界。
 hold on
 for k = 1:length(B) %K表示B单元数组中的第k个元素。即代表第k个边界区域。 
  boundary = B{k}; %计算一个边界的所有点 
 plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 1) %设置所有点,颜色,线宽等。boundary(:,2)表示x,boundary(:,1)表示y 
end ;title('contur');

bwboundaries 函数

Trace region boundaries in a binary image.在二值图像中跟踪区域边界

用法:

A、 B = BWBOUNDARIES(BW) 跟踪对象的外部边界和对象内部的孔洞的外部边界。它也能对最外部对象(父对象)以及子对象(完全被父对象封闭的对象)进行追踪。其中,BW必须为二值图像,且非零像素属于对象,零像素为背景部分。B为返回值,为一个包含P个元素的cell 数组(单元数组),p是对象和孔洞的数量。每个cell单元包含一个Q*2的二维数组,Q是对应对象的边界像素的数量。该Q*2的二维数组的每行包含边界像素的行列坐标。

B、B = BWBOUNDARIES(BW,CONN)  在对父对象和子对象边界进行追踪时指定使用连通性。CONN可以为8或4,表示8连通或者4连通。如果不指定,则默认为8连通。

B是一个P*1的单元数组,P代表连通体个数,B内每行是一个Q*2的矩阵。Q内每一行白哦是连通体的边界像素的位置坐标。第一列是纵坐标Y,第二列是横坐标X,Q为边界像素的个数。所以boundary(:,2)为x,boundary(:,1)为x。点击打开链接

C、B = BWBOUNDARIES(BW,CONN,OPTIONS)  提供选择字符串输入。该字符串可以为noholes。即寻找不包含孔的边缘。默认情况下,追踪对象区域以及孔区域边界。

D、[B,L] = BWBOUNDARIES(...) 返回一个标记矩阵L,最为第二个输出。对象和孔都被标记,L是一个二维非负整数数组,表示连续区域。第K个区域包含了L中值为K的所有元素。L所代表的对象和孔的数量等于max(L(:))。而L中的零值元素代表背景。

E、[B,L,N,A] = BWBOUNDARIES(...)  返回找到的对象数目N,邻域矩阵A 。B中的第一个N单元(cell),是对象边界。A代表父对象--子对象-孔 之间的相关性。A是一个边长为max(L(:))的平方,稀疏,逻辑矩阵,其中行和列与存储在B中的边界位置一致。通过使用A及B(m)对边界进行闭合,或者闭合边界B(m)。(该处翻译有误,待修正)闭合方法:

 enclosing_boundary  = find(A(m,:));  %enclosing闭合边界 enclosed_boundaries = find(A(:,m));% enclosed被闭合边界

使用实例:

1、读入图像,使用彩色图显示标记对象,其中背景为灰色,区域边界轮廓为白色。

I = imread('<span style="font-family: Arial, Helvetica, sans-serif;">IMG-0025-00001.jpg</span>');
       BW = im2bw(I, graythresh(I));
       [B,L] = bwboundaries(BW,'noholes');
       imshow(label2rgb(L, @jet, [.5 .5 .5]))
       hold on
       for k = 1:length(B)
           boundary = B{k};
           plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
       end

2、覆盖图像区域边界。显示文本表明了区域数量(基于标记矩阵),紧靠每个边界。另外,使用SPY显示邻域矩阵。

BW = imread('<span style="font-family: Arial, Helvetica, sans-serif;">IMG-0025-00001.jpg</span>');
       [B,L,N,A] = bwboundaries(BW);
       imshow(BW); hold on;
       colors=['b' 'g' 'r' 'c' 'm' 'y'];
       for k=1:length(B),
         boundary = B{k};
         cidx = mod(k,length(colors))+1;
         plot(boundary(:,2), boundary(:,1), colors(cidx),'LineWidth',2);
         %randomize text position for better visibility
         rndRow = ceil(length(boundary)/(mod(rand*k,7)+1));
         col = boundary(rndRow,2); row = boundary(rndRow,1);
         h = text(col+1, row-1, num2str(L(row,col)));
         set(h,'Color',colors(cidx),'FontSize',14,'FontWeight','bold');
       end
       figure; spy(A);


3、显示对象边界为红色,孔边界为绿色。

 BW = imread('<span style="font-family: Arial, Helvetica, sans-serif;">IMG-0025-00001.jpg</span>');
       [B,L,N] = bwboundaries(BW);
       imshow(BW); hold on;
       for k=1:length(B),
         boundary = B{k};
         if(k > N)
           plot(boundary(:,2), boundary(:,1), 'g','LineWidth',2);
         else
           plot(boundary(:,2), boundary(:,1), 'r','LineWidth',2);
         end
       end




  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值