Применение маски к изображению для обрезки переднего плана дает неполный вывод

Так что я взял OpenCV 3 дня назад. Всего новичок. Я загрузил код онлайн для реализации Lazy Snapping, инструмента для вырезания изображений, который очень похож на Grabcut. Я думал, что это проект C ++, но большая часть кода написана в стиле C и завершена до создания маски. Я думал о том, чтобы расширить его, чтобы применить маску к исходному изображению, вырезать передний план и вставить его в другое изображение.

Я не смог найти много помощи на C. Поэтому я сохранил маску и прочитал ее, используя Mat (C ++). Вот небольшой фрагмент кода:

cvSaveImage("Mask.jpg",mask);
cvSaveImage("Object_Marking_Output.jpg",showImg);
cvSaveImage("Original.jpg",original);
Mat masky = imread("Lazy Snapping/mask.jpg", 1);
Mat showImg1 = imread("Lazy Snapping/Original.jpg", 1);

Mat crop(showImg1.rows, showImg1.cols, CV_8UC3);
//Though the mask appears black and white I kept getting errors
//This convert code helped it go away. I could recreate the error if necessary
cvtColor(masky,masky,CV_RGB2GRAY);
//I resize it because the mask created is smaller
cv::resize(masky, masky, showImg1.size());

showImg1.copyTo(crop, masky);
//bitwise_and(showImg1, cv::Scalar(255,255,255), crop, masky);

// normalize so imwrite(...)/imshow(...) shows the mask correctly!
normalize(masky.clone(), masky, 0.0, 255.0, CV_MINMAX, CV_8UC1);

// show the images
imshow("Mask used to apply on image", masky);
imshow("Lazy snapped output", crop);

Однако мой вывод выглядит очень странно. Я пытаюсь снять полотенце на голове, рассматривая все остальное как фон. Созданная маска идеальна и очерчивает только полотенце. Однако, применяя его к входному изображению, я получаю эти дополнительные разбросанные биты фона на выходном изображении (это не позволяет мне публиковать изображения напрямую. Так вот ссылка на Dropbox):

https://www.dropbox.com/sh/z4u22n9yyfhcnpx/AAA8QxU9tkLGgEEyS_2QFuG2a

Я понятия не имею, почему это происходит, потому что из уроков и ответов, которые я читал на форумах, это выглядит как правильный путь. copyTo и bitwise_and дают одинаковый вывод. Буду признателен за любую оказанную помощь. Заранее спасибо!

1

Решение

эти «дыры» уже есть в вашей маске img (если у вас есть imgviewer с инструментом пипетки, вы можете проверить сами, что соответствующие части не полностью черные, но как 0x020202, поэтому в этих областях маскирование не выполняется)

так,

threshold(masky,masky, 120,255, 0);

ваше изображение, так что это совершенно «двоичный»

PS: избегайте сохранения таких вещей как jpg. ваша проблема выглядит как артефакт сжатия / интерполяции

2

Другие решения