Vid*_*dar 2 matlab image-processing octave
我有几个连接组件的二进制图像,一些大和一些小(可能只有1个像素).有了这个,我正在寻找一种方法,以有效的方式使每个连接的组件成为检查器模式,而不是连接的blob.
到目前为止,我已经提出了两种可以尝试的方法,但它们可能会产生错误,或者效率很低:
我知道整个图像,并可以制作一个检查器模式掩码,以删除50%的像素.这非常快,但平均会删除50%的连接组件,这些组件只占一个像素区域.
使用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)
没有什么比毯子检查更有效率了.您需要做的就是添加小型连接组件.
%# 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)

| 归档时间: |
|
| 查看次数: |
1219 次 |
| 最近记录: |