удаление водяного знака с помощью opencv

#image-processing #watermark

Вопрос:

Я использовал opencv и c , чтобы удалить водяной знак с изображения, используя приведенный ниже код.

 #include <stdio.h>
#include <opencv2/opencv.hpp>
#include <Windows.h>
#include <string>
#include <filesystem>

namespace fs = std::filesystem;

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
bool debugFlag = true;
std::string path = "C:/test/";
for (const autoamp; entry : fs::directory_iterator(path))
{
    std::string  fileName = entry.path().string();
    Mat original = imread(fileName, cv::IMREAD_COLOR);
    if (debugFlag) { imshow("original", original); }
    Mat inverted;
    bitwise_not(original, inverted);
    std::vector<Mat> channels;
    split(inverted, channels);

    for (int i = 0; i < 3; i  )
    {
        if (debugFlag) { imshow("chan"   std::to_string(i), channels[i]); }
    }

    Mat bwImg;
    cv::threshold(channels[2], bwImg, 50, 255, cv::THRESH_BINARY);
    if (debugFlag) { imshow("thresh", bwImg); }

    Mat outputImg;
    inverted.copyTo(outputImg, bwImg);

    bitwise_not(outputImg, outputImg);
    if (debugFlag) { imshow("output", outputImg); }

    if (debugFlag) { waitKey(0); }
    else { imwrite(fileName, outputImg); }
}
}
 

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

Теперь на предыдущем изображении, как вы можете видеть, исходное изображение имеет оранжевый/красный водяной знак. Я создал маску, которая уничтожит водяной знак, а затем применил ее к исходному изображению (это также удаляет серую границу текста). Еще один трюк, который помог, заключался в использовании красного канала, так как водяной знак наиболее насыщен красным цветом ~245). Обратите внимание, что для этого требуется opencv и c 17

Но теперь я хочу удалить водяной знак на новом изображении, цвет которого похож на цвет водяного знака, как показано ниже, поскольку вы можете видеть некоторые водяные знаки на изображении сбоку на китайском языке, перекрывающиеся с текстом. как этого добиться с помощью моего текущего кода, любая помощь будет признательна. введите описание изображения здесь

Ответ №1:

Две идеи, которые стоит попробовать:

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

2: Попробуйте использовать функцию открытия opencv. Ваш основной текст кажется толще водяного знака, поэтому вы должны уметь его изолировать. Аналогично, после создания маски сохраненного текста один раз расширьте и замаскируйте исходное изображение.