我有一张图片如下
我创建了一个matlab代码,可以检测圆周上的像素并创建一个整数掩码,这样我就可以用C ++代码导入它。这是一个主要算法的片段。 (我使用imread并将图像存储在N X N数组中
for i=1:nx
for j=1:ny
if (wholeGeom(j,i) == 255)
B(j,i) = 1;
elseif ((wholeGeom(j,i) == 0)&& ...
((i==1||i==nx) && j>1 && j<nx)&& ...
(wholeGeom(j+1,i)==255 || ...
wholeGeom(j-1,i)==255) )
B(j,i) = 2;
elseif ((wholeGeom(j,i) == 0)&& ...
((j==1||j==nx) && i>1 && i<nx)&& ...
(wholeGeom(j,i+1)==255 || ...
wholeGeom(j,i-1)==255) )
B(j,i) = 2;
elseif ((wholeGeom(j,i) == 0)&& ...
(i>1 && j>1 && i<nx && j<nx)&& ...
(wholeGeom(j+1,i)==255 || ...
wholeGeom(j-1,i)==255 ||...
wholeGeom(j,i+1)==255 ||...
wholeGeom(j,i-1)==255) )
else
B(j,i) = 0;
这适合我。我的输出如下
我只是想知道是否有更有效的方法来做到这一点,尤其是在matlab上......任何建议都会受到赞赏
答案 0 :(得分:0)
确实,形态学操作是你的朋友。 Morphological operations是处理二进制图像的非常快速的工具。您可以imdilate
使用"dilate"图片,即&#34;加厚&#34;图像中的所有对象。
% Load image
wholeGeom = rgb2gray(imread('https://i.stack.imgur.com/Jt4TC.png'));
% Threshold to make image binary
wholeGeom = wholeGeom > 128;
% Dilate image, i.e. add 1 pixel to each side of an object
borders = imdilate(wholeGeom, [0,1,0;1,1,1;0,1,0]);
% Set borders to 2 and everything inside object to 1
result = 2*borders - wholeGeom;
结果(放大以使边框更加明显):
答案 1 :(得分:0)
找到任何形式的参数形状的更真实方法是使用Hough Transforms,它使用投票机制在图像中查找任何类型的参数形状。在这种情况下,您可以使用:
%imfindcircles internally uses Hough Transforms
centers = imfindcircles(img,radius)
[centers,radii] = imfindcircles(img,radiusRange)