我想做的是拍摄几种植物的图像,并从图像中去除背景线和噪点。然后,最终结果有望转化为二进制图像,其中每个 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 框架实现:
- 反转图像颜色
- 二值化
- 形态侵蚀
- 形态扩张
在原始图像下方,二值图像和一些叶子被分割。
源代码:
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 回答