我的一位生物学家 friend 问我是否可以帮助他制定一个程序来对蜥蜴的鳞片(这是正确的翻译?)进行计数。
他给我发了一些图片,我在Matlab上做了一些尝试。对于某些图像,它比其他图像难得多,例如,当存在较暗(黑色)区域时。至少用我的方法。我相信我可以在这里得到一些有用的帮助。我应该如何改善呢?我采取了正确的方法吗?
这些是一些图像。
通过遵循Image Processing and Counting using MATLAB我得到了最好的结果。基本上是将图像转换为黑白图像,然后对其进行阈值处理。但是我确实增加了一点侵 eclipse 。
这是代码:
img0=imread('C:...\pic.png');
img1=rgb2gray(img0);
%The output image BW replaces all pixels in the input image with luminance greater than level with the value 1 (white) and replaces all other pixels with the value 0 (black). Specify level in the range [0,1].
img2=im2bw(img1,0.65);%(img1,graythresh(img1));
imshow(img2)
figure;
%erode
se = strel('line',6,0);
img2 = imerode(img2,se);
se = strel('line',6,90);
img2 = imerode(img2,se);
imshow(img2)
figure;
imshow(img1, 'InitialMag', 'fit')
% Make a truecolor all-green image. I use this later to overlay it on top of the original image to show which elements were counted (with green)
green = cat(3, zeros(size(img1)),ones(size(img1)), zeros(size(img1)));
hold on
h = imshow(green);
hold off
%counts the elements now defined by black spots on the image
[B,L,N,A] = bwboundaries(img2);
%imshow(img2); hold on;
set(h, 'AlphaData', img2)
text(10,10,strcat('\color{green}Objects Found:',num2str(length(B))))
figure;
%this produces a new image showing each counted element and its count id on top of it.
imshow(img2); 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);
这些是一些结果。您可以在左上角之一看到有多少计数。
另外,我认为将计数的元素标记为绿色很有用,这样至少用户可以知道哪些必须手动计数。
最佳答案
您应该考虑一条路线:watershed segmentation。这是第一个镜像的简单示例(假定您具有IP工具箱):
raw=rgb2gray(imread('lCeL8.jpg'));
Icomp = imcomplement(raw);
I3 = imhmin(Icomp,20);
L = watershed(I3);
%%
imagesc(L);
axis image
结果显示为彩色图:
然后,您可以按以下方式对单元格进行计数:
count = numel(unique(L));
优点之一是可以将其直接馈送到
regionprops
并为您提供有关单个“squama”的所有详细信息:r=regionprops(L, 'All');
imshow(raw);
for k=2:numel(r)
if r(k).Area>100 % I chose 100 to filter out the objects with a small are.
rectangle('Position',r(k).BoundingBox, 'LineWidth',1, 'EdgeColor','b', 'Curvature', [1 1]);
end
end
您可以用来监视过度/不足分割:
注意:特别感谢@jucestain帮助正确访问
r
结构here中的字段