Как исправить разрушенные прямоугольники? - PullRequest
0 голосов
/ 30 января 2011

По сути, у меня есть такое изображение enter image description here

или изображение с несколькими прямоугольниками в одном изображении.Прямоугольники полностью черно-белые, имеют «грязные» края и выемки, но довольно легко сказать, что они прямоугольники.Точнее, это маски изображений.Белые области являются частями изображения, которые должны быть «оставлены в покое», но черные части должны быть битальными.

Мой вопрос: как сделать из этого ухудшенного красивого и четкого прямоугольникаодин?Я человек из Python, но у меня есть , чтобы использовать Qt и C ++ для этой задачи.Было бы предпочтительнее, если бы не использовались другие библиотеки.

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 января 2011

На данный момент мы предположим, что все они должны быть прямоугольниками без вращения. В этом случае вы должны быть в состоянии использовать довольно простой подход. Начиная с каждого пикселя на краю растрового изображения, начинайте сэмплирование пикселей, проходящих внутрь, пока не встретите переход. Запишите расстояние от края для каждого перехода (если он есть). После того как вы сделали это с каждого края, вы в основном «голосуете» - расстояние, которое чаще всего происходило от этого края, - это то, что вы рассматриваете как этот край прямоугольника. Если прямоугольник действительно выровнен, это должно составлять большую часть расстояний.

Если вместо этого вы видите несколько расстояний с почти одинаковыми частотами, есть вероятность, что прямоугольник повернут (или, по крайней мере, один край). В этом случае вы можете разделить сторону пополам (например) и повторить. Как только вы достигли подавляющего большинства точек в каждом регионе, согласовав расстояние, вы можете (попытаться) линейно интерполировать между ними, чтобы получить прямую линию (и ограничение минимального размера региона ограничит максимальное вращение - если вы получите до некоторого размера, не достигнув соглашения, вы смотрите на борозду, а не на край прямоугольника). Аналогично, если у вас есть регион (или более одного), который не совсем совпадает с остальными и не будет соответствовать линии, вам, вероятно, следует также игнорировать его - опять же, вы, вероятно, смотрите на выбоину не то, что задумано как ребро.

1 голос
/ 30 января 2011

Если ограничивающий прямоугольник, содержащий все не черные пиксели, может делать то, что вы хотите, это должно сработать:

int boundLeft = INT_MAX;
int boundRight = -1;
int boundTop = INT_MAX;
int boundBottom = -1;
for(int y=0;y<imageHeight;++y) {
    bool hasNonMask = false;
    for(int x=0;x<imageWidth;++x) {
        if(isNotMask(x, y)) {
            hasNonMask = true;
            if(x < boundLeft) boundLeft = x;
            if(x > boundRight) boundRight = x;
        }
    }
    if(hasNonMask) {
        if(y < boundTop) boundTop = y;
        if(y > boundBottom) boundBottom = y
    }
}

Если результат имеет отрицательный размер, то в нем не будет пикселя без маскиизображение.Код можно оптимизировать, но мне еще не хватило кофе.:)

1 голос
/ 30 января 2011

Обычно вы делаете это, неоднократно расширяя и размывая маску. Я не думаю, что у qt есть готовые функции для этого, поэтому вам, вероятно, придется реализовать их самостоятельно, если вы не хотите использовать библиотеки - http://ostermiller.org/dilate_and_erode.html содержит информацию о том, как реализовать функции.

...