私がやりたいのは、いくつかの植物の画像を撮り、画像から背景の線とノイズを取り除くことです。最終結果は、すべての 1 値がプラントの一部であるバイナリ イメージに変換できることを願っています。手動のしきい値を使用せずにこれを自動的に行う方法はありますか? 私が調べた 1 つの解決策は、ノイズではないものの値を推定してから減算することですが、これは植物の一部を削除することになります。入力画像の例: http://i.imgur.com/utAX6yu.png
質問する
3065 次
2 に答える
3
I=im2bw(I,graythresh(I));
imshow(I)
于 2013-12-17T17:00:26.447 に答える
0
境界が明確ではないため、各葉をセグメント化するのは簡単な作業ではありません。以下に示すソリューションでは、いくつかの葉をセグメント化していますが、すべてではありません。これは、良い出発点となるシンプルなソリューションです。
Marvin Frameworkを使用して実装されたアルゴリズム:
- 画像の色を反転する
- 二値化
- 形態侵食
- 形態学的拡張
元の画像の下に、バイナリ画像といくつかの葉がセグメント化されています。
ソースコード:
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 に答える