从连接组件制作检查器的有效方法

Vid*_*dar 2 matlab image-processing octave

我有几个连接组件的二进制图像,一些大和一些小(可能只有1个像素).有了这个,我正在寻找一种方法,以有效的方式使每个连接的组件成为检查器模式,而不是连接的blob.

到目前为止,我已经提出了两种可以尝试的方法,但它们可能会产生错误,或者效率很低:

  1. 我知道整个图像,并可以制作一个检查器模式掩码,以删除50%的像素.这非常快,但平均会删除50%的连接组件,这些组件只占一个像素区域.

  2. 使用bwlabel()仅通过施加掩模,以该组件,如果它是在1个像素(而留下其它成分当环路到达它们被认为是),每个连接部件在MATLAB /倍频程,和循环.这可能是非常低效的.

是否可以使用任何智能/内置解决方案?

例

代码生成图

T = zeros(40,40);
T(10:30,10:30) = 1;

chessVec = repmat([1;0],20,1);

T_wanted = (repmat([chessVec circshift(chessVec,1)],1,20).*T);

figure();
subplot(1,2,1);imshow(T);title('Start shape')
subplot(1,2,2);imshow(T_wanted);title('Wanted shape');
Run Code Online (Sandbox Code Playgroud)

Jon*_*nas 7

没有什么比毯子检查更有效率了.您需要做的就是添加小型连接组件.

%# create a test image
img = rand(100)>0.8;
img = imclose(img,ones(5));
img = imerode(img,strel('disk',2));
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

%# get connected components
%# use 4-connect to preserve
%# the diagonal single-pixel lines later
cc = bwconncomp(img,4)

%# create checkerboard using one of Matlab's special matrix functions
chk = invhilb(100,100) < 0;

%# checker original image, add back small stuff
img(chk) = 0;

smallIdx = cellfun(@(x)x<2,cc.PixelIdxList);
img([cc.PixelIdxList{smallIdx}]) = 1;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这是一个很好的答案! (2认同)