画像から影を取り除く


7

画像からブドウのみを抽出したい。残念ながら、時々私はブドウを正確に手に入れません。

すべてのケースでうまく機能しないコードがあります。時々、それは影とブドウを区別しません。

入力画像の例:

ここに画像の説明を入力してください

私が得ている結果:

ここに画像の説明を入力してください

そしてこれは私のコードです:

RGB = imread('DSC02807.JPG');
GRAY = rgb2gray(RGB);

threshold = graythresh(GRAY);
originalImage = im2bw(GRAY, threshold);

originalImage = bwareaopen(originalImage,250);

SE = strel('disk',10);
IM2 = imclose(originalImage,SE);

originalImage = IM2;

imshow(originalImage);

私はこの質問がSE dspでより適切であると思います...
bla

@nate、ありがとう..しかし、SE dspはどういう意味ですか?私はそれが小さな環境だと読みましたが、本当にわかりません:/それについて教えていただけますか?

アロン、私はあなたのコードをテストしました、そして私はそれについて何が正確でないのか本当に理解していません。影をうまく取り除きます。
bla

3
@Alon Shmiel指定された入力/出力ペアは良い結果を生み出すようです。おそらく、この特定の出力の問題が具体的にどこにあるのか、あるいは、問題がより簡単に見えるように入力/出力イメージのペアを投稿できますか?
ペネロペ2012年

1
アロンズの元々の問題は、細長い円柱のように見えるものではなく、各ブドウの真下にある暗い影を取り除くことだと思います。ブドウだけを正確にセグメント化する必要があります-形は奇妙に見え、影の楕円形や円形のcozではありません。それとも、影ではなく、ブドウの光が屈折してそのように見える最も薄い外皮ですか?

回答:


8

これはコードが生成するものです(IM2から取得される白い境界でcolormap(hot)を使用)。 ここに画像の説明を入力してください

私は影がうまく処理されていると思いますが、なぜあなたのコードは影とブドウの間で気付かないと思いますか?

これは、この画像を生成するために使用されるコードです

bw=IM2<1;
[B,L] = bwboundaries(bw,'noholes'); % fill any holes, so that regionprops can be used to estimate
imagesc(GRAY); hold on
for k = 1:length(B) 
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 1); hold on
end
colormap(hot(256))

1
私は同意します、影はうまく見えます。代わりに、いくつかの不規則性を引き起こすのはブドウのハイライト(たとえば、一番上の行のブドウ4と5を参照)です。
Junuxx 2012年

1
この答えが最も良い説明になります。@Alon Shmiel:影に関する問題についてより具体的に説明し、適切でない例を投稿してください。敬具
mchlfchr 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.