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;

私の問題は、バナナの写真を使用するとスコアに複数の値が含まれますが、リンゴの他の写真を使用すると値が1つしか得られないことです。問題は、取り残されたノイズにあります。sobel のようないくつかのエッジ検出方法を使用しようとしていましたが、エッジ検出を白黒画像と組み合わせることができません。

だから私の質問は、果物の端をどのように検出して、果物全体を取得し、ノイズを取り除く方法です。フルーツの丸みを出したいだけです。

4

3 に答える 3

2

これは部分的な答えにすぎません。最も単純なエッジ検出器はハイパスフィルターです。画像を1つでフィルタリングしてから、ある種のしきい値を使用してエッジがどこにあるかを判断します。私は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

fspecialMatlab の には、エッジ検出用に定義済みのソーベルフィルターとプレウィットフィルターがあります。さらに単純に、edge関数を使用します。もちろん、グレースケール画像で行う必要があります。

画像内のエッジを検出した後、円形検出のためにハフ変換を確認することもできます。houghは直線のみを検出するように見えるので、円形に適用する方法を理解する必要があります。または、Matlab 中央に既存のソリューションがあります ( 12 )

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 に答える