Как я могу стереть край водяного знака? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть изображение src (исходное изображение слишком велико для загрузки): that

, и у меня есть белый фоновый логотип: enter image description here

Я пытался использовать код OpenCV:

    std::string file_name = "E:\\xxx\\IMG_0001.JPG";
    cv::Mat image = cv::imread(file_name);
    cv::Mat mask_not;
    cv::Mat mask = cv::imread("E:\\xxx\\white_eva.jpg",0);
    cv::Mat logo = cv::imread("E:\\xxx\\white_eva.jpg");
    cv::bitwise_not(mask,mask_not);
    cv::cvtColor(mask_not,mask_not,cv::COLOR_GRAY2BGR);
    std::cout<<mask_not.type()<<std::endl;
    cv::Mat imageROI;
    imageROI = image(cv::Rect(image.cols-logo.cols-10,image.rows-logo.rows-10,logo.cols,logo.rows));
    cv::imwrite("E:\\xxx\\imageROI.jpg",imageROI);
    logo.copyTo(imageROI,mask_not);
    cv::imwrite("E:\\xxx\\test.JPG",image);

Результат такой: enter image description here

Как выКак видно из рисунка, вокруг логотипа есть белый край.Сначала я думаю, что причина в том, что маска недостаточно велика, чтобы замаскировать логотип.Но, как вы можете видеть, край логотипа, кажется, показывает целиком.Итак, это смутило меня.Первый вопрос: как стереть белый край водяного знака?

1 Ответ

1 голос
/ 03 июля 2019

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

    std::string file_name = "./image1.jpg";
    cv::Mat image = cv::imread(file_name);
    cv::Mat mask_not;
    cv::Mat mask = cv::imread("./eva.jpg",0);
    cv::Mat logo = cv::imread("./eva.jpg");

    // MORPHOLOGY OPS HERE
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,
                       Size(5, 5),
                       Point(-1, -1));

    for (int i = 0; i < 20; ++i) {
        cv::morphologyEx( mask, mask, cv::MORPH_CLOSE, element );
        cv::morphologyEx( mask, mask, cv::MORPH_CLOSE, element );
        cv::morphologyEx( mask, mask, cv::MORPH_CLOSE, element );
        cv::medianBlur(mask, mask, 5);
    }

    cv::Mat element_dilate = cv::getStructuringElement(cv::MORPH_RECT,
                       Size(5, 5),
                       Point(-1, -1));
    cv::dilate(mask, mask, element_dilate);


    cv::bitwise_not(mask,mask_not);

    cv::imshow("win", mask_not);
    cv::waitKey(0);

    cv::cvtColor(mask_not,mask_not,cv::COLOR_GRAY2BGR);
    std::cout<<mask_not.type()<<std::endl;
    cv::Mat imageROI;
    imageROI = image(cv::Rect(image.cols-logo.cols-10,image.rows-logo.rows-10,logo.cols,logo.rows));
    cv::imwrite("./imageROI.jpg",imageROI);
    logo.copyTo(imageROI,mask_not);
    cv::imwrite("./test.JPG",image);

Результирующее изображение (я немного изменил размеры изображений, поэтому вам может понадобиться изменить размеры ядра в морфологических операциях): enter image description here

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