3

私がやりたいのは、いくつかの植物の画像を撮り、画像から背景の線とノイズを取り除くことです。最終結果は、すべての 1 値がプラントの一部であるバイナリ イメージに変換できることを願っています。手動のしきい値を使用せずにこれを自動的に行う方法はありますか? 私が調べた 1 つの解決策は、ノイズではないものの値を推定してから減算することですが、これは植物の一部を削除することになります。入力画像の例: http://i.imgur.com/utAX6yu.png

4

2 に答える 2

3
I=im2bw(I,graythresh(I));
imshow(I)

ここに画像の説明を入力

于 2013-12-17T17:00:26.447 に答える
0

境界が明確ではないため、各葉をセグメント化するのは簡単な作業ではありません。以下に示すソリューションでは、いくつかの葉をセグメント化していますが、すべてではありません。これは、良い出発点となるシンプルなソリューションです。

Marvin Frameworkを使用して実装されたアルゴリズム:

  1. 画像の色を反転する
  2. 二値化
  3. 形態侵食
  4. 形態学的拡張

元の画像の下に、バイナリ画像といくつかの葉がセグメント化されています。

ここに画像の説明を入力

ソースコード:

public class RemoveBackground {

    public RemoveBackground(){
        // 1. Load plug-ins
        MarvinImagePlugin erode = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.erosion");
        MarvinImagePlugin dilate = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.dilation");
        MarvinImagePlugin invert = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.color.invert");

        // 2. Set plug-ins attributes
        boolean[][] m = MarvinMath.getTrueMatrix(15,15);
        erode.setAttribute("matrix", m);
        dilate.setAttributes("matrix", m);

        // 3. Load and process the image
        MarvinImage image = MarvinImageIO.loadImage("./res/flowers.png");
        invert.process(image.clone(), image);
        MarvinImage binImage = MarvinColorModelConverter.rgbToBinary(image, 127);
        MarvinImageIO.saveImage(binImage, "./res/flowers_bin.png");
        erode.process(binImage.clone(), binImage);
        dilate.process(binImage.clone(), binImage);
        MarvinImageIO.saveImage(binImage, "./res/flowers_out.png");
    }

    public static void main(String[] args) {
        new RemoveBackground();
    }
}
于 2013-12-20T13:06:02.063 に答える