我想做的是拍摄几株植物的图像,并从图像中去除背景线和噪点。最终结果将有望变成二进制图像,其中每1个值只是工厂的一部分。有没有办法让我自动执行此操作而无需使用手动阈值?我研究过的一个解决方案就是估计不是噪声的值然后减去,但这会导致部分植物被移除。输入的示例图像是:http://i.imgur.com/utAX6yu.png
答案 0 :(得分:3)
I=im2bw(I,graythresh(I));
imshow(I)
答案 1 :(得分: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();
}
}