通过matlab删除图像中不需要的区域

时间:2014-03-25 06:37:03

标签: image matlab image-processing classification image-segmentation

我有一个包含物体和一些不需要的区域(小点)的图像。我想删除它。因此,我使用一些形态运算符示例'close'来删除。但它并不完美。你有其他方法去除更清楚吗?您可以在raw image

下载示例图片

这是我的代码

load Image.mat %load Img value
Img= bwmorph(Img,'close');
imshow(Img);

enter image description here enter image description here

2 个答案:

答案 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:接下来将讨论bsxfunregionprops方法之间的比较基准。

案例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);

<强>输出

enter image description here

基准测试结果

--- 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;

<强>输出

enter image description here

基准测试结果

--- With regionprops method:
Elapsed time is 0.116706 seconds.
---- With bsxfun method:
Elapsed time is 0.012406 seconds.

如前所述,我已经使用其他更大的图像和大量不需要的blob进行了测试,bsxfun方法对regionprops方法没有任何改进。由于MATLAB库中没有任何这样大的图像,因此无法在此讨论。总之,可以建议基于输入特征使用这两种方法中的任何一种。看看这两种方法对输入图像的表现会很有趣。

答案 1 :(得分:5)

您可以使用regionpropsbwlabel选择小于某个区域(=像素数)的所有区域

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