gpt4 book ai didi

image - 如何根据凹性对二值图像进行分割?

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:09 25 4
gpt4 key购买 nike

我有一个二进制图像,例如:

enter image description here

我希望将主要的大椭圆白色部分与顶部的小蘑菇云分开。对于许多不同的图像,这需要是一个自动过程,这些图像可能完全不同,但仍将具有主要 Blob 和上方或侧面接触的较小 Blob 的特征。

我正在考虑使用分水岭,但它并不适用于所有情况,具体取决于额外 Blob 的比例。我现在正在尝试查看是否有一种方法可以找到二值图像的边缘并为该边缘的凹度设置条件,但我找不到如何执行此操作。

理想情况下在 MATLAB 中实现,但如果在 SciPy/Mathematica 中可以做得更好,那也很好。

最佳答案

这是我的尝试。代码很粗糙,但它是关于如何使用边界和带符号曲率找到将“蘑菇顶”与 body 的其余部分分开的两个点,然后使用 turn predicate 来确定点的总体思路兴趣。

clear; clc;

binary_img = imread('bin.jpg') > 100;

% Get boundaries
b = bwboundaries(binary_img);

% Get largest boundary
b = b{cellfun(@length,b) == max(cellfun(@length,b))};

% Filter boundary - use circular convolution
b(:,1) = cconv(b(:,1),fspecial('gaussian',[1 81],40)',size(b,1));
b(:,2) = cconv(b(:,2),fspecial('gaussian',[1 81],40)',size(b,1));

% Find curvature
curv_vec = zeros(length(b),1);
for i = 0:size(b,1)-1
p_b = b(mod(i-25,length(b))+1,:); % p_b = point before
p_m = b(mod(i,length(b))+1,:); % p_m = point middle
p_a = b(mod(i+25,length(b))+1,:); % p_a = point after

dx_ds = p_a(1)-p_m(1); % First derivative
dy_ds = p_a(2)-p_m(2); % First derivative
ddx_ds = p_a(1)-2*p_m(1)+p_b(1); % Second derivative
ddy_ds = p_a(2)-2*p_m(2)+p_b(2); % Second derivative
curv_vec(i+1) = dx_ds*ddy_ds-dy_ds*ddx_ds;
end

% Find local maxima for curvature
[pks,locs] = findpeaks(curv_vec);
[pks,pks_idx] = sort(pks);

% Select two largest curvatures
p1_max = b(curv_vec == pks(end),:);
p2_max = b(curv_vec == pks(end-1),:);

% Paint biggest contiguous region
rp = regionprops(binary_img,'Area','PixelIdxList','PixelList');
rp = rp(max(vertcat(rp.Area)) == vertcat(rp.Area));

% Paint all points to the left of the line
img = zeros(size(binary_img));
img(rp.PixelIdxList) = 0.5;
for i = 1:length(rp.PixelList)
turn = sign(det([1 p1_max(1) p1_max(2);
1 p2_max(1) p2_max(2);
1 rp.PixelList(i,2) rp.PixelList(i,1);]));

if (turn > 0)
img(rp.PixelList(i,2),rp.PixelList(i,1)) = 1;
end
end

figure(1);
subplot(1,3,1);
plot(b(:,1), b(:,2),'o');
hold on;
plot(p1_max(1), p1_max(2),'ro','Markersize',5,'LineWidth', 5);
plot(p2_max(1), p2_max(2),'ro','Markersize',5,'LineWidth', 5);

subplot(1,3,2);
plot(curv_vec);

subplot(1,3,3);
imshow(img);

使用这张图片:

enter image description here

输出:

enter image description here

关于image - 如何根据凹性对二值图像进行分割?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359350/

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