通过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:接下来将讨论几个用于比较 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);

输出

基准测试结果

--- 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 tocregionprops 的运行时比较。 bsxfun 快多少? @Shai 查看编辑 -1。 +1 用于广泛的基准测试!非常好的和高质量的答案。【参考方案2】:

您可以使用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

【讨论】:

谢谢先生。但是您的代码有一些错误。我安装它并收到错误:“错误使用 horzcat CAT 参数尺寸不一致。removeUnwantedRegion (第 6 行)newImg( [st(toRemove).PixelIdxList] ) = 0; % remove 中的错误。我的图像尺寸是 384x384 错误发生在newImg([st(toRemove).PixelIdxList]) = 0; .我调试它我找到了它 @user3336190 我的错:Matlab 将PixelIdxList 存储为每个区域的列向量。将它们全部连接在一起时,需要垂直分类(使用vertcat)而不是水平分类(使用[])。

以上是关于通过matlab删除图像中不需要的区域的主要内容,如果未能解决你的问题,请参考以下文章

matlab函数_连通区域

(转)Matlab的区域处理函数

转matlab函数_连通区域

如何判断一个区域是不是是连通的 matlab

matlab求连通区域的最大直径

从图像中删除所有空白区域