天天看點

使用opencv去除圖像水印應用(一)

作者:https://stackoverflow.com/questions/32125281/removing-watermark-out-of-an-image-using-opencv

使用opencv去除圖像水印應用(一)

首先我有這個圖像,我想做一個應用程式,可以檢測圖像像它,并從中删除圓(水印)

>使用形态濾波去除筆劃。這應該給你一個背景圖檔。

使用opencv去除圖像水印應用(一)

>計算差分圖像:差分=背景 – 初始和門檻值it:binary = threshold(difference)​

使用opencv去除圖像水印應用(一)

>門檻值背景圖像并提取由水印覆寫的暗區​

使用opencv去除圖像水印應用(一)

>從初始圖像中,提取水印區域内的像素,并門檻值這些像素,然後将其粘貼到較早的二進制圖像​

使用opencv去除圖像水印應用(一)

上面是一個粗略的描述。下面的代碼應該更好地解釋。​

Mat im = [load the color image here];Mat gr, bg, bw, dark;cvtColor(im, gr, CV_BGR2GRAY);// approximate the backgroundbg = gr.clone();for (int r = 1; r < 5; r++){
    Mat kernel2 = getStructuringElement(MORPH_ELLIPSE, Size(2*r+1, 2*r+1));
    morphologyEx(bg, bg, CV_MOP_CLOSE, kernel2);
    morphologyEx(bg, bg, CV_MOP_OPEN, kernel2);}// difference = background - initialMat dif = bg - gr;// threshold the difference image so we get dark lettersthreshold(dif, bw, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);// threshold the background image so we get dark regionthreshold(bg, dark, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);// extract pixels in the dark regionvector<unsigned char> darkpix(countNonZero(dark));int index = 0;for (int r = 0; r < dark.rows; r++){
    for (int c = 0; c < dark.cols; c++)
    {
        if (dark.at<unsigned char>(r, c))
        {
            darkpix[index++] = gr.at<unsigned char>(r, c);
        }
    }}// threshold the dark region so we get the darker pixels inside itthreshold(darkpix, darkpix, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);// paste the extracted darker pixelsindex = 0;for (int r = 0; r < dark.rows; r++){
    for (int c = 0; c < dark.cols; c++)
    {
        if (dark.at<unsigned char>(r, c))
        {
            bw.at<unsigned char>(r, c) = darkpix[index++];
        }
    }}                                                                                     

關注【OpenCV學習交流】

繼續閱讀