Сегментация области в сегментированной области

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

введите описание изображения здесь

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

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

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

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

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

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


person Olivier_s_j    schedule 31.03.2012    source источник


Ответы (2)


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

person dvhamme    schedule 31.03.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

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

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

person Orest V    schedule 31.03.2012