我的目标是用白色勾勒整个动物(左),但只是动物的一部分。我目前的结果(右)平均来说并不是那么好。
我的问题:如何从给定的图像中生成更准确的表示?
我不熟悉涉及类似问题的突出算法。
这是我用来转换此图像的Matlab函数:
function [I] = binarize(M)
figure, subplot(121),imshow(M)
I = M;% imshow(I);
BW = im2bw(I, graythresh(im2double(I)));
se = strel('disk',3);
BW = imdilate(BW,se);
[B,L] = bwboundaries(BW,'noholes');
s = regionprops(BW, 'Area');
for k = 1:length(B)
S(k)=s(k).Area;
end
[a_max,in_max]=max(S);
hold on;
boundary = B{in_max};
[n,m] = size(boundary);
elm = zeros(1,n*m);
mer = 1;
for k=1:(n)
elm(mer) = boundary(k,2);
elm(mer+1) = boundary(k,1);
mer = mer+2;
end
I=insertShape(im2double(I),'FilledPolygon',elm, 'Color','white','Opacity',1);
I=im2bw(I);
end
答案不一定是在matlab中。谢谢!
答案 0 :(得分:4)
对图像进行阈值处理并分析得到的二进制图像是一种非常粗鲁的前景指令方法。如今,有更多高级方法可以完成这项任务。其中之一称为GrabCut,它基于一种非常强大的离散优化技术,称为MRF能量最小化。 Here是GrabCut的一个Matlab实现。
请注意,GrabCut及其兄弟姐妹需要对它们进行某种初步猜测才能运行,因此您的二进制图像结果对此非常有用。
答案 1 :(得分:0)
另一个更快速和肮脏的选择是在HSV中转换图像,然后应用阈值处理和形态过滤,例如:
HSVimg=rgb2hsv(M);
BW=im2bw(HSVimg(:,:,3), graythresh(HSVimg(:,:,3)));
se = strel('disk',6);
BW2 = imfill(imclose(BW,se), 'holes');
imshow(BW2);
结果: