Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中检测图像内部的圆形_Matlab_Image Processing_Shape - Fatal编程技术网

在MATLAB中检测图像内部的圆形

在MATLAB中检测图像内部的圆形,matlab,image-processing,shape,Matlab,Image Processing,Shape,检测图像中这些圆形的最快方法是什么 半径始终在(80-100mm)之间。背景总是白色的。这个圆永远在中心 我已经试过了,但我真的没能让它起作用。我是新来的,我觉得Hough变换在这方面做得太过火了。请建议我做这件事的正确方法。 更新 这是我应用hough变换后得到的结果 我使用了前面提到的算法 下面是来自更大算法的相关代码 % applying Hough Below [accum, circen, cirrad] = ... CircularHough_Grd(gR, [89 9

检测图像中这些圆形的最快方法是什么

半径始终在(80-100mm)之间。背景总是白色的。这个圆永远在中心

我已经试过了,但我真的没能让它起作用。我是新来的,我觉得Hough变换在这方面做得太过火了。请建议我做这件事的正确方法。


更新

这是我应用hough变换后得到的结果

我使用了前面提到的算法

下面是来自更大算法的相关代码

% applying Hough Below
[accum, circen, cirrad] = ...
    CircularHough_Grd(gR, [89 93],...
    17.4, 13, 1);   % this executes in 0.72 sec

% Lets see what we got
imshow(gR);
hold on;
plot(circen(:,1), circen(:,2), 'r+');
for ii = 1 : size(circen, 1)
    rectangle('Position',[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...
        'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
end
hold off;

有意义的圆是中间的一个。

< P>这是我的建议:
1.转换为灰色图像,增强“与白色的差异”


2.清除白色区域的阈值

BW = im2bw( gimg, .4 ); 

3.获取图像区域的面积和质心孔隙度

st = regionprops( ~BW, 'Area', 'Centroid', 'PixelIdxList' );
四,。仅选择足够大的区域

sel = [st.Area] > numel(BW)*0.025; % at least 2.5% of image size
st = st(sel);
五,。计算区域到图像中心的距离

cntr = .5 * [size(BW,2) size(BW,1)]; % X-Y coordinates and NOT Row/Col
d = sqrt( sum( bsxfun(@minus,vertcat( st.Centroid ), cntr ).^2, 2 ) );
六,。选择离中心最近的区域

[mn idx] = min(d);
七,。创建一个掩码

res = false(size(BW)); 
res( st(idx).PixelIdxList ) = true;


您还可以考虑使用其他区域属性(例如,<代码>偏心率)更好地拒绝非圆形区域。

< P>如果您的MATLAB版本是R2012a或更高版本,则图像处理工具箱包括用于检测图像中的圆圈的函数<代码> IfDefSncult/Cuth>。p>
filen='http://i.stack.imgur.com/pmBp1.jpg';  % your original image
I=imread(filen);

I=im2bw(I(:,:,3));  % convert to gray scale
Rmin=50;Rmax=100;  % circle radius range
[centersDark, radiiDark] = imfindcircles(I, [Rmin Rmax], ...
                                        'ObjectPolarity','dark','sensitivity',0.93)
imagesc(I),hold on
viscircles(centersDark, radiiDark,'LineStyle','--');hold off
结果是:


实际上这个函数也应用了Hough变换,我想它和你的类似。您可能需要注意的是,与Hough中的灵敏度相对应的阈值对检测结果有很大影响。灵敏度过高会导致检测到更多的圆圈,包括较弱或部分模糊的圆圈,但错误检测率较高,而这正是您获得的结果。

请先展示您自己的尝试,以确保您获得了一个圆圈,您可以检查它的面积与最大半径的比率是否很高。@Shai这是一次$niper射击。圆圈不知道是什么击中了他们。它只需要0.04秒(与我正在做的hough变换相比太少了)!作为下一步,我将把白色不完美的圆包围在一个正方形内,得到它的中心,并近似一个更好的圆,然后将该圆用作遮罩,然后尝试获得圆的颜色。这种方法正确吗?还是有现成的方法可以做到这一点?@wy-看看
regionprops
以及它能为您提供什么。在我的代码中,您已经在结构数组的
'Centroid'
字段中找到了圆心。根据您需要的精度,您必须找到一种方法来估计圆的半径。如果它是你想要的颜色-那么你不需要估计一个圆-你所需要的就是遮罩
res
t=重塑(img,[],3);c=平均值(t(res,:),1)
将为您提供遮罩像素的平均颜色。@Shai
重塑(img,[],3)
抛出已知尺寸的乘积,3,不可整除为元素总数,450800。错误。我想我需要截断或填充img数组,使其大小可以被3整除。@wy如果彩色图像的元素数不能被3整除,那么这就是wierd:你应该有大小为3的三维空间,对应于每个像素的R、G和B分量。这太过分了。查看wy的运行时间。@lennon310我有R2010a。我能否获得发布版的
imfindcircles
?这个脚本需要多少时间才能得到这个圆?它应该包含在图像处理工具箱中。实现imfindcircles需要~0.7秒,而regionprops需要~0.05秒。因此,如果要处理大量图像,速度可能会慢得多。
filen='http://i.stack.imgur.com/pmBp1.jpg';  % your original image
I=imread(filen);

I=im2bw(I(:,:,3));  % convert to gray scale
Rmin=50;Rmax=100;  % circle radius range
[centersDark, radiiDark] = imfindcircles(I, [Rmin Rmax], ...
                                        'ObjectPolarity','dark','sensitivity',0.93)
imagesc(I),hold on
viscircles(centersDark, radiiDark,'LineStyle','--');hold off