#c #image-processing #opencv
#c #обработка изображений #opencv
Вопрос:
Я новичок в 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. Я действительно не хочу, чтобы кто-то писал мне код здесь, мне просто нужны несколько советов, но поскольку вы упомянули об этом, я разместил код сейчас … спасибо
Ответ №1:
Если я правильно понимаю, у вас есть маска (двоичное изображение), и вы хотите совместить ее с вашим исходным изображением. Попробуйте это:
cvAnd(source, source, destination, mask)
Этот дубль source
не является опечаткой. Вы просто сравниваете source
с самим собой (без операции), но только для тех пикселей в mask
, которые «включены» (то есть, != 0
). Обратите внимание, что маска должна быть 8-разрядным одноканальным изображением.