Nav*_*eep 2 matlab image-processing
请任何人告诉我如何仅使用形态学操作从这个图像中删除突出物.另外,我想将圆(白色)半径减少5个像素.我知道我们可以通过使用侵蚀来做到这一点,但应该是结构元素(磁盘类型)半径应该是多少以及我们应该为所选半径执行多少次迭代.
我的意思是我们可以有结构元素se = strel('disk',5)并执行一次迭代或se = strel('disk',1)并执行5次迭代.

Matlab有一个简单的功能,你可以这样做.您可以使用形态学打开操作和形态学侵蚀操作来实现此目的.代码可以在下面找到.
I = imread( 'O3Z7j.jpg' );
figure; imshow( I )
D = imopen(I,strel( 'disk', 50 ) );
figure; imshow( D )
E = imerode(D,strel( 'disk', 5 ) );
figure; imshow( E )
Run Code Online (Sandbox Code Playgroud)
基本上,正如维基描述的那样,形态开放是"集A侵蚀的扩张",这里定义了侵蚀.要创建结构元素内核,可以使用strel( 'disk', n )定义半径的光盘n.
结果显示在这里.

这是侵蚀前的图像.

之前的图像显示在这里.

编辑:表现
>> sum( sum( I>128 ) )
ans =
227675
>> sum( sum( D>128 ) )
ans =
227173
>> 227675 - 227173
ans =
502
Run Code Online (Sandbox Code Playgroud)
编辑2:为新要求添加了imerode.
假设您的图像在一个BW数组中,您可以找到主磁盘的中心,bwdist然后找到相对于到中心的距离正常分布的像素.
在实践中,这给出了:
tol = 25;
% --- Get the center
D = bwdist(1-BW);
[~,I] = max(D(:));
[y, x] = ind2sub(size(BW), I);
% --- Find distances
[Y, X] = find(BW);
J = find(BW);
[d2, K] = sort((X-x).^2 + (Y-y).^2);
z = 1:numel(d2);
f = fit(z', d2, 'poly1');
I = (d2 > z'*f.p1 + f.p2 + tol);
BW(J(K(I))) = 0;
Run Code Online (Sandbox Code Playgroud)
结果:

您可以调整参数tol以或多或少地侵蚀突出部分,但它不应低于20,否则您将删除主磁盘的像素.
最好,
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |