2012-03-31 3 views
3

Вот изображение:сегментация Площадь в сегментной области

enter image description here

Я хотел бы знать, как я могу установить черный круг на белом, а остальные к черному.

(Так сегментируйте черный круг в белой области).

Я знаю, что могу инвертировать изображение, и круг будет белым ... но так будет и вся черная часть, которая видна на этом изображении.

Если бы мне пришлось делать это в Matlab, я бы выполнил операцию подключенного компонента и проверил круглость BLOB. Хотя я должен сделать это в opencv (javacv, если быть точным.)

Есть ли простой способ сделать это в opencv (javacv).

Thx заранее

ответ

2

В OpenCV есть простой способ использования findContours() и drawContours(). Если вы используете иерархическую версию findContours(), вы можете просмотреть иерархию и нарисовать (заполнить) дочерний контур только белого квадрата. Это имеет дополнительное преимущество, что вы можете сделать некоторые проверки на здравомыслие (например, проверить размер контура, чтобы увидеть, если он примерно соответствует вашему размеру), если это необходимо. Я ничего не знаю о java или javacv, но, может быть, вы можете проверить пример C++ для findcontours, включенных в opencv, для вдохновения?

0

Вы можете обнаружить объекты изображения на изображениях с помощью OpenCV библиотеку (через Java адаптер); для этого вам нужно будет тренировать сеть для кругов.

Что касается именно вашего случая (вероятно, это решение не будет родовым), вы можете разделить изображение на сегменты, и используя в качестве условия - изменение цвета, см псевдокод ниже:

//build color switching list 
List<Point> colorSwitches = ... 
for(each horizontal line from image){ 
    for(each pixel from line){ 
     if(color of previous pixel != color of current pixel){ 
      colorSwitches.add(currentPoint) 
     } 
    }  
} 
// so, you have detected margins of your image objects; now we need to merge neighbor pixels into image objects, where image object is collection of margin points(you should create this class) 
List<ImageObject> imageObjects = ... 
for(each color switch){ 
    if(current pixel is connected with pixels from existing image objects){ 
     // returns image object neared with current point 
     getRelatedImageObject(imageObjects).add(currentPoint); 
    }else{ 
     imageObjects.add(new ImageObject(currentPixel)); 
    } 
} 
// now we have list of objects from image, and we need to match objects 

Ok, его общие черты как сделать то, что вам нужно, если вам понадобится более точно, я попытаюсь объяснить более подробно. Также вы можете связаться со мной напрямую

Надеюсь, это вам поможет.