Я думаю, что лучший инструмент для обработки изображений зависит от типа проекта, над которым вы работаете.
Если вы работаете над исследовательским проектом, требующим повышения производительности, быстрой проверки и написания отчетов, Matlab и аналогичные инструменты являются лучшим вариантом.С другой стороны, если вы разрабатываете программный продукт, Java, C ++, C, Objective-C и т. Д. больше указывается.Решения Matlab не так просто доставить и поддерживать в работе.
Поскольку вы спросили, как выполнить сегментацию изображений в Java, я приведу пример с использованием Java и Marvin Image Processing Framework .По предложению @Asif Sharif, сегментация FloodFill - хорошая стратегия, и я ее использовал!
ВХОДНОЕ ИЗОБРАЖЕНИЕ:
ВЫХОДНОЕ ИЗОБРАЖЕНИЕ:
КАК ЭТО РАБОТАЕТ:
- Загрузка входного изображения.
- Измените зеленые пиксели на белые пиксели.
- Примените пороговое значение интенсивности для отделения переднего плана от фона.
- Примените морфологическое закрытие к группированным частям одного и того же объекта
- Используйте сегментацию FloodFill дляполучить сегменты.
- Нарисуйте координаты сегментов в исходном изображении.
ИСТОЧНИК:
import static marvin.MarvinPluginCollection.*;
public class SimpleSegmentation {
public SimpleSegmentation(){
// 1. Load image
MarvinImage original = MarvinImageIO.loadImage("./res/robocup.jpg");
MarvinImage image = original.clone();
// 2. Change green pixels to white
filterGreen(image);
// 3. Use threshold to separate foreground and background.
MarvinImage bin = MarvinColorModelConverter.rgbToBinary(image, 127);
// 4. Morphological closing to group separated parts of the same object
morphologicalClosing(bin.clone(), bin, MarvinMath.getTrueMatrix(30, 30));
// 5. Use Floodfill segmention to get image segments
image = MarvinColorModelConverter.binaryToRgb(bin);
MarvinSegment[] segments = floodfillSegmentation(image);
// 6. Show the segments in the original image
for(int i=1; i<segments.length; i++){
MarvinSegment seg = segments[i];
original.drawRect(seg.x1, seg.y1, seg.width, seg.height, Color.yellow);
original.drawRect(seg.x1+1, seg.y1+1, seg.width, seg.height, Color.yellow);
}
MarvinImageIO.saveImage(original, "./res/robocup_segmented.png");
}
private void filterGreen(MarvinImage image){
int r,g,b;
for(int y=0; y<image.getHeight(); y++){
for(int x=0; x<image.getWidth(); x++){
r = image.getIntComponent0(x, y);
g = image.getIntComponent1(x, y);
b = image.getIntComponent2(x, y);
if(g > r*1.5 && g > b*1.5){
image.setIntColor(x, y, 255,255,255);
}}}
}
public static void main(String[] args) { new SimpleSegmentation(); }
}