分割灰度图像

时间:2012-11-15 17:32:05

标签: matlab image-processing image-segmentation morphological-analysis mathematical-morphology

我无法正确分割灰度图像:

Image to be segmented

基本的事实,即我希望细分看起来像这样:

Ground truth

我最感兴趣的是圈内的三个组成部分。因此,正如您所看到的,我想将顶部图像分为三个部分:两个半圆,以及它们之间的矩形。

我尝试了各种扩张,侵蚀和重建组合,以及各种聚类算法,包括k-means,isodata和高斯混合 - 所有这些都取得了不同程度的成功。

任何建议都将不胜感激。

编辑:这是我能够获得的最佳结果。这是使用活动轮廓来分割圆形ROI,然后应用等数据聚类获得的:

Clusters

这有两个问题:

  • 右下方群集周围的白色光环,属于左上角群集
  • 右上角和左下角群集周围的灰色光环,属于中心群集。

2 个答案:

答案 0 :(得分:7)

这是一个首发...... 使用circular Hough transform查找圆形部分。为此我最初threshold the image locally

 im=rgb2gray(imread('Ly7C8.png'));
 imbw = thresholdLocally(im,[2 2]); % thresold localy with a 2x2 window
 % preparing to find the circle
 props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
 [~,indexOfMax] = max([props.Area]);
 approximateRadius =  props(indexOfMax).MajorAxisLength/2;
 radius=round(approximateRadius);%-1:approximateRadius+1);
 %find the circle using Hough trans.
 h = circle_hough(edge(imbw), radius,'same');
 [~,maxIndex] = max(h(:));
 [i,j,k] = ind2sub(size(h), maxIndex);
 center.x = j;     center.y = i;

 figure;imagesc(im);imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
 title('Finding the circle using Hough Trans.');

enter image description here

仅选择圈内的内容:

 [y,x] = meshgrid(1:size(im,2),1:size(im,1));
 z = (x-j).^2+(y-i).^2;
 f = (z<=radius^2);
 im=im.*uint8(f);

修改

使用bwlabel找到一个开始阈值的地方,通过查看直方图,找到它的第一个局部最大值并从那里迭代直到找到2个单独的段来对图像进行分割:

  p=hist(im(im>0),1:255);
  p=smooth(p,5);
  [pks,locs] = findpeaks(p);

  bw=bwlabel(im>locs(1));
  i=0;
  while numel(unique(bw))<3
     bw=bwlabel(im>locs(1)+i); 
     i=i+1;
  end


 imagesc(bw);

enter image description here

现在可以通过从圆圈中取出两个标记的部分来获得中间部分,剩下的将是中间部分(+一些光环)

 bw2=(bw<1.*f);

但经过一些中值滤波后,我们得到了更合理的东西

 bw2= medfilt2(medfilt2(bw2));

我们一起得到:

 imagesc(bw+3*bw2); 

enter image description here

最后一部分是一个真正的“快速和肮脏”,我相信使用你已经使用的工具你会得到更好的结果......

答案 1 :(得分:1)

也可以使用watershed transformation获得近似结果。这是倒像上的分水岭 - &gt;分水岭(255-I)以下是一个示例结果:

enter image description here

另一种简单方法是使用光盘结构元素对原始图像执行形态学闭合(可以对粒度进行多尺度闭合),然后获得整圆。在这个提取之后,圆圈和组件更容易。

se = strel('disk',3);
Iclo = imclose(I, se);% This closes open circular cells.
Ithresh = Iclo>170;% one can locate this threshold automatically by histogram modes (if you know apriori your cell structure.)
Icircle = bwareaopen(Ithresh, 50); %to remove small noise components in the bg

enter image description here

Ithresh2 = I>185; % This again needs a simple histogram.

enter image description here