我有一个包含物体和一些不需要的区域(小点)的图像。我想删除它。因此,我使用一些形态运算符示例'close'来删除。但它并不完美。你有其他方法去除更清楚吗?您可以在raw image
下载示例图片这是我的代码
load Image.mat %load Img value
Img= bwmorph(Img,'close');
imshow(Img);
答案 0 :(得分:9)
您可能更喜欢使用bsxfun
的更快速和矢量化方法以及从bwlabel
本身获取的信息。
注意: bsxfun
是内存密集型的,但这正是使它更快的原因。因此,请注意以下代码中B1
的大小。一旦达到系统设置的内存约束,此方法将变慢,但在此之前它提供了比regionprops
方法更好的加速。
<强>代码强>
[L,num] = bwlabel( Img );
counts = sum(bsxfun(@eq,L(:),1:num));
B1 = bsxfun(@eq,L,permute(find(counts>threshold),[1 3 2]));
NewImg = sum(B1,3)>0;
编辑1:接下来将讨论bsxfun
和regionprops
方法之间的比较基准。
案例1
基准代码
Img = imread('coins.png');%%// This one is chosen as it is available in MATLAB image library
Img = im2bw(Img,0.4); %%// 0.4 seemed good to make enough blobs for this image
lb = bwlabel( Img );
threshold = 2000;
disp('--- With regionprops method:');
tic,out1 = regionprops_method1(Img,lb,threshold);toc
clear out1
disp('---- With bsxfun method:');
tic,out2 = bsxfun_method1(Img,lb,threshold);toc
%%// For demo, that we have rejected enough unwanted blobs
figure,
subplot(211),imshow(Img);
subplot(212),imshow(out2);
<强>输出强>
基准测试结果
--- With regionprops method:
Elapsed time is 0.108301 seconds.
---- With bsxfun method:
Elapsed time is 0.006021 seconds.
案例2
基准代码(仅列出案例1中的更改)
Img = imread('snowflakes.png');%%// This one is chosen as it is available in MATLAB image library
Img = im2bw(Img,0.2); %%// 0.2 seemed good to make enough blobs for this image
threshold = 20;
<强>输出强>
基准测试结果
--- With regionprops method:
Elapsed time is 0.116706 seconds.
---- With bsxfun method:
Elapsed time is 0.012406 seconds.
如前所述,我已经使用其他更大的图像和大量不需要的blob进行了测试,bsxfun
方法对regionprops
方法没有任何改进。由于MATLAB库中没有任何这样大的图像,因此无法在此讨论。总之,可以建议基于输入特征使用这两种方法中的任何一种。看看这两种方法对输入图像的表现会很有趣。
答案 1 :(得分:5)
您可以使用regionprops
和bwlabel
选择小于某个区域(=像素数)的所有区域
lb = bwlabel( Img );
st = regionprops( lb, 'Area', 'PixelIdxList' );
toRemove = [st.Area] < threshold; % fix your threshold here
newImg = Img;
newImg( vertcat( st(toRemove).PixelIdxList ) ) = 0; % remove