gpt4 book ai didi

matlab - 从连接的组件制作跳棋的有效方法

转载 作者:行者123 更新时间:2023-12-02 07:39:53 24 4
gpt4 key购买 nike

我有几个连通分量的二值图像,有些大,有些小(可能只有 1 个像素)。有了这个,我正在寻找一种方法,以一种有效的方式使每个连接的组件成为跳棋图案,而不是连接的 Blob 。

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

  1. 我知道整个图像,可以制作一个棋盘格图案蒙版来移除 50% 的像素。这非常快,但平均会移除 50% 的连通分量,这些连通分量的面积仅为一个像素。

  2. 在 MATLAB/Octave 中使用 bwlabel(),并循环遍历每个连接的组件,如果它超过 1 个像素,则仅将掩码应用于该组件(同时让其他组件被考虑当循环到达他们时)。这可能非常低效。

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

Example

生成图的代码

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

最佳答案

没有什么比一揽子检查更能提高效率了。然后您需要做的就是加回小的连接组件。

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

enter image description here

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

enter image description here

关于matlab - 从连接的组件制作跳棋的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com