Image 清理二进制图像的最佳方法

Image 清理二进制图像的最佳方法,image,matlab,image-processing,Image,Matlab,Image Processing,我的目标是用白色勾勒出整个动物(左),但只是动物的一部分。平均而言,我目前的结果(右)并不太好 我的问题是:如何从给定的图像生成更精确的表示 我不熟悉涉及类似问题的突出算法 以下是我用来转换此图像的Matlab函数: function [I] = binarize(M) figure, subplot(121),imshow(M) I = M;% imshow(I); BW = im2bw(I, graythresh(im2double(I))); se = strel('di

我的目标是用白色勾勒出整个动物(左),但只是动物的一部分。平均而言,我目前的结果(右)并不太好

我的问题是:如何从给定的图像生成更精确的表示

我不熟悉涉及类似问题的突出算法

以下是我用来转换此图像的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中。谢谢大家!

对图像进行阈值化并分析得到的二值图像是一种非常粗糙的前景指令方法。现在,有更先进的方法来完成这项任务。其中一个叫做GrabCut,它基于一种非常强大的离散优化技术,称为MRF能量最小化。是GrabCut的一个Matlab实现


请注意,GrabCut及其同级需要某种初始猜测才能运行,因此二进制图像的结果对此非常有用。

对图像进行阈值化并分析生成的二进制图像是一种非常粗糙的前景指令方法。现在,有更先进的方法来完成这项任务。其中一个叫做GrabCut,它基于一种非常强大的离散优化技术,称为MRF能量最小化。是GrabCut的一个Matlab实现


请注意,GrabCut及其同级需要某种初始猜测才能运行,因此您的二值图像结果对此非常有用。

另一个更快速、更脏的选项是在HSV中转换图像,然后应用阈值和形态学过滤,例如:

HSVimg=rgb2hsv(M);
BW=im2bw(HSVimg(:,:,3), graythresh(HSVimg(:,:,3)));

se = strel('disk',6);
BW2 = imfill(imclose(BW,se), 'holes');
imshow(BW2);
结果:


另一个更快速、更脏的选项是在HSV中转换图像,然后应用阈值和形态学过滤,例如:

HSVimg=rgb2hsv(M);
BW=im2bw(HSVimg(:,:,3), graythresh(HSVimg(:,:,3)));

se = strel('disk',6);
BW2 = imfill(imclose(BW,se), 'holes');
imshow(BW2);
结果: