Сегментация области внутри сегментированной области - PullRequest
3 голосов
/ 31 марта 2012

Вот изображение:

enter image description here

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

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

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

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

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

Спасибо заранее

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

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

0 голосов
/ 01 апреля 2012

Вы можете обнаружить объекты изображения на изображениях, используя библиотеку 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

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

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

...