0

我有这个计算圆度的代码

 I = imread('http://energyfanatics.com/wp-content/uploads/2008/05/banana.jpg');
%I = imread('http://www.nyapplecountry.com/images/photosvarieties/redrome04.jpg');
pic = rgb2gray(I);
threshold = graythresh(pic);
bw = im2bw(pic,threshold);
fbw = ones(size(bw))-imfill(ones(size(bw))-bw); 
invImg = ~fbw;
imshow(invImg);
f = bwlabel(invImg);
S = regionprops(f,'Area','Perimeter','centroid');
res = (min(sqrt([S.Area]),[S.Perimeter]/4)./(max(sqrt([S.Area]), [S.Perimeter]/4))).^2;

我的问题是当我使用香蕉的图片时,我的得分有多个值,但是当我使用苹果的另一张图片时,我只得到一个值。问题在于留下的噪音。我试图使用一些边缘检测方法,如 sobel,但我无法将边缘检测与黑白图像结合起来。

所以我的问题是如何检测水果的边缘以便得到整个水果以及如何消除噪音。我只想得到水果的圆润度。

4

3 回答 3

2

这只是部分答案。最简单的边缘检测器是高通滤波器。用一个过滤你的图片,然后使用某种阈值来确定边缘在哪里。我在 Matlab 中太生疏了,不记得如何做好这件事,但它是这样的:

hp_filt = [0 1 0; -1 0 1; 0 -1 0];

filtered_pic = conv2(orig_pic, hp_filt);

edges = (filtered_pic > thresh);

您必须自己计算阈值。

不幸的是,我手头没有 Matlab 来查看这是否有效。

于 2012-09-19T13:02:01.183 回答
1

fspecial在 Matlab 中预定义了用于边缘检测的SobelPrewitt滤波器。更简单的是,使用edge函数。当然,它应该在灰度图像上完成。

在检测图像边缘后,您可能还想查看用于圆形检测的Hough 变换。hough似乎只检测直线,所以你必须弄清楚如何将它用于圆形。或者 Matlab 中心 ( 1 , 2 )有现有的解决方案

PS对于您的特定方法,您可能只是regionprops根据区域阈值过滤返回的对象,如下所示:Thr=100; S=S([S.Area]>Thr);

于 2012-09-19T14:31:40.730 回答
0

补充@Nathan Fellman@Victor K的答案,您可以使用Canny Edge Detector。与其他方法相比,这种方法不太可能被噪声愚弄,并且更有可能检测到真正的弱边缘。MATLAB 函数edge也有一个实现:

BW = edge(I,'canny')
BW = edge(I,'canny',thresh)
BW = edge(I,'canny',thresh,sigma)
[BW,threshold] = edge(I,'canny',...)
于 2012-09-19T14:59:58.053 回答