我的图像如下所示:
http://oi62.tinypic.com/2dr5jd0.jpg
我在代码中应用某种阈值。我可以将下面的蓝色物体分开:
http://oi62.tinypic.com/1zdrmzp.jpg
但是,现在我在分离这些蓝色物体时遇到了问题。我应用了分水岭(我不知道我是对还是错)但它没有成功,所以我需要帮助来分离这些连接的对象。
我尝试使用的代码如下所示:
RGB=imread('testImage.jpg');
RGB = im2double(RGB);
cform = makecform('srgb2lab', 'AdaptedWhitePoint', whitepoint('D65'));
I = applycform(RGB,cform);
channel1Min = 12.099;
channel1Max = 36.044;
channel2Min = -9.048;
channel2Max = 48.547;
channel3Min = -53.996;
channel3Max = 15.471;
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
maskedRGBImage = RGB;
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;
figure
imshow(maskedRGBImage)
答案 0 :(得分:1)
一般来说,这种类型的细分是一个严重的研究问题。在您的情况下,使用morphology operations的组合可以很好地完成。这些在显微镜图像处理中得到广泛应用。
首先,通过移除小斑点和填充洞来清理BW
,
BWopen = imopen(BW, strel('disk', 6));
BWclose = imclose(BWopen, strel('disk', 6));
(您可能希望稍微调整结构元素,“6”只是一个似乎适用于测试图像的半径。)
然后你可以使用侵略性侵蚀来产生一些种子
seeds = imerode(BWclose, strel('disk', 35));
可以用于分水岭,或者只是将BW
中的每个点分配给最近的种子
labels = bwlabel(seeds);
[D, i] = bwdist(seeds);
closestLabels = labels(i);
originalLabels = BWopen .* closestLabels;
imshow(originalLabels, []);
答案 1 :(得分:1)
我会尝试以下步骤:
将图像转换为灰色,然后转换为二进制蒙版。
应用形态开口(imopen)清洁小的嘈杂物体。
使用bwlabel应用连接组件分析(CCA)。每个连接的组件至少包含一个对象。
这些蓝色物体看起来像拉伸/扭曲的圆圈,所以我会尝试Hough变换来检测每个标记组件内的cicles。有一个内置函数(imfindcircles)或在线可用的代码(Hough transform for circles),具体取决于您的Matlab版本和可用的工具箱。
然后,您需要对每个组件内的对象数量N做出一些决定(N> = 1)。我事先并不知道最佳标准应该是什么,但您也可以应用这些简单的规则: [i]对象需要具有最小尺寸。 [ii]重叠圆圈对应同一个对象(或不对应,具体取决于重叠量)。
然后,圆形质心可以作为种子来完成最终的对象分割。当然,如果每个组件中只有一个圆圈,则只需将其直接保留为对象。
我没有在Matlab中检查所有有效步骤,但我很快检查了1,2和4,他们似乎很有希望。我在图像的中心显示最困难组件的圆检测结果:
我用来创建此图片的代码是:
close all;clear all;clc;
addpath 'circle_hough'; % add path to code of [Hough transform for circles] link above
im = imread('im.jpg');
img = rgb2gray(im);
mask = img>30; mask = 255*mask; % create a binary mask
figure;imshow(mask)
% filter the image so that only the central part of 6 blue objects remains (for demo purposes only)
o = zeros(size(mask)); o(170:370, 220:320) = 1;
mask = mask.*o;
figure;imshow(mask);
se = strel('disk',3);
mask = imopen(mask,se); % apply morphological opening
figure;imshow(mask);
% check for circles using Hough transform (see also circle_houghdemo.m in [Hough transform for circles] link above)
radii = 15:5:40; % allowed circle radii
h = circle_hough(mask, radii, 'same', 'normalise');
% choose the 10 biggest circles
peaks = circle_houghpeaks(h, radii, 'nhoodxy', 15, 'nhoodr', 21, 'npeaks', 10);
% show result
figure;imshow(im);
for peak = peaks
[x, y] = circlepoints(peak(3));
hold on;plot(x+peak(1), y+peak(2), 'g-');
end
答案 2 :(得分:0)
一些自发的想法。我假设最终目标是计算蓝色小体。如果是这样,我会寻找一种方法来确定这些物体的总面积和细胞的平均面积。作为第一步转换为二进制(黑色和白色):
git pull --rebase
由于形态学操作(打开/关闭)不会保留区域,我会使用bwlabel查找连接的组件。看图片,我看到12个孤立的小体,两个连通的组,边缘的一些截断的小体和一些小的噪声片段。因此,首先删除小物体和那些接触边缘。然后确定总面积(bwarea)和对象的中值大小作为一个细胞平均面积的代理。