Использование изображения в качестве маски для другого - PullRequest
1 голос
/ 29 апреля 2011

Я новичок в OpenCV, и у меня есть несколько вопросов:

Как я могу использовать одно изображение в качестве маски для другого изображения?

Например, у меня есть изображение, содержащее пустой круг, а другое изображение содержит кружок с содержимым (не пустым) и фоном.

Как извлечь общие части двух изображений в новое изображение?

Я пытался извлечь пиксель за пикселем, чтобы выполнить операцию (И), но она не удалась!

Может ли кто-нибудь помочь мне получить некоторые идеи!

Я пробую следующий код (который я нашел здесь), но он дает неправильный результат!

Я пробовал его с двоичным изображениемзаменив

CvScalar bgr = cvScalar(b, g, r);
cvSet2D(mask, iy+y, ix+x, bgr);

на

CvScalar bgr = cvScalar(b);
cvSet2D(mask, iy+y, ix+x, b);

void processImage(IplImage* mask, IplImage* source, int x, int y) {
    int b,g,r;
    for (int ix=0; ix<source->width; ix++) {
        for (int iy=0; iy<source->height; iy++) {
            //r = cvGet2D(source, iy, ix).val[2] * cvGet2D(mask, iy, ix).val[2];
            //g = cvGet2D(source, iy, ix).val[1] * cvGet2D(mask, iy, ix).val[1];;
            b = cvGet2D(source, iy, ix).val[0] * cvGet2D(mask, iy, ix).val[0];

            CvScalar bgr = cvScalar(b); //, g, r);
            cvSet2D(mask, iy+y, ix+x, b); //gr);
        }
    }
}

1 Ответ

2 голосов
/ 29 апреля 2011

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

cvAnd(source, source, destination, mask)

Эта двойная source не опечатка.Вы просто ANDing source с самим собой (без операции), но только для тех пикселей в mask, которые включены (то есть != 0).Обратите внимание, что маска должна быть 8-битным одноканальным изображением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...