通过matlab删除图像中不需要的区域
Posted
技术标签:
【中文标题】通过matlab删除图像中不需要的区域【英文标题】:Remove unwanted region in image by matlab 【发布时间】:2014-05-02 20:27:50 【问题描述】:我的图像包含对象和一些不需要的区域(小点)。我想删除它。因此,我使用一些形态运算符示例“关闭”来删除。但它并不完美。你有其他方法可以去除更清晰吗?您可以在raw image下载示例图片
这是我的代码
load Image.mat %load Img value
Img= bwmorph(Img,'close');
imshow(Img);
【问题讨论】:
raw image
链接似乎已损坏。
【参考方案1】:
您可能更喜欢使用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 库中没有任何此类更大的图像,因此无法在此处讨论。综上所述,可以建议根据输入特征使用这两种方法中的任何一种。看看这两种方法如何处理您的输入图像会很有趣。
【讨论】:
您能否提供tic
toc
与regionprops
的运行时比较。 bsxfun
快多少?
@Shai 查看编辑 -1。
+1 用于广泛的基准测试!非常好的和高质量的答案。【参考方案2】:
您可以使用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
【讨论】:
谢谢先生。但是您的代码有一些错误。我安装它并收到错误:“错误使用 horzcat CAT 参数尺寸不一致。removeUnwantedRegion (第 6 行)newImg( [st(toRemove).PixelIdxList] ) = 0; % remove 中的错误。我的图像尺寸是 384x384 错误发生在newImg([st(toRemove).PixelIdxList]) = 0; .我调试它我找到了它 @user3336190 我的错:Matlab 将PixelIdxList
存储为每个区域的列向量。将它们全部连接在一起时,需要垂直分类(使用vertcat
)而不是水平分类(使用[]
)。以上是关于通过matlab删除图像中不需要的区域的主要内容,如果未能解决你的问题,请参考以下文章