如何删除水印的边缘?

时间:2019-07-03 08:44:19

标签: image opencv image-processing

我有一个类似的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 个答案:

答案 0 :(得分:1)

我尝试在蒙版图像上添加形态学操作。所以这就是我可以达到的。

    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