2014年6月7日 星期六

Digital Image Processing#5 - 浮水印(Visible Watermark)

文章流程
  • 一分完成浮水印(Blending Function) 
  • 實作參考與連結
  • 一句後洗洗睡


一分完成浮水印(Blending Function)

一樣用本魯蛇照,廢話不多說



(3... 2... 1... 0)
(浮水印位於身體中央處,Done)

Blending Function程式碼講解

 Mat watermark = imread("watermarkimage.png")
 Mat img = imread("yourimage.jpg");
 //assuming the watermark has same number of channel and size as your_image
 Mat watermarked = (0.8 * img) +  (0.2 * watermark)

只要你的watermarkimage.png與原圖一樣Size,上面Code就秒解
你可以設計好watermark,然後複製貼到跟原圖一樣大的黑底圖裡,小畫家萬能
只是這樣太無聊了,下面做改進

微改進:使用者可移動浮水印位置,再輸出圖片

    // Control panel to choose condition range
    namedWindow( "Control panel", CV_WINDOW_AUTOSIZE );
    int mark_x = 207; // 預設值, 可以自行調整, 注意, 這邊沒有錯誤處理, 有問題請設成0
    createTrackbar("Watermark Position LeftUp X", "Control panel", &mark_x, iWidthSrc - iWidthMark);
    int mark_y = 530;
    createTrackbar("Watermark Position LeftUp Y", "Control panel", &mark_y, iHiehgtSrc - iHiehgtMark);

    while (true) {
        // Initial PaddingMark for user
        Mat imgPaddingMark =Mat::zeros(imgOriginal.size(),imgOriginal.type());
        int stepPadd = imgPaddingMark.step;
        int iChannelPadd = imgPaddingMark.channels();
        uchar* dataPadd = imgPaddingMark.data + mark_y*stepPadd + mark_x*iChannelPadd;

        // Processing Watermark
        dataMark = imgWatermark.data;
        for (int y = 0; y < iHiehgtMark; ++y, dataMark += stepMark, dataPadd += stepPadd)  
        {  
            uchar* mark_data = dataMark;
            uchar* padd_data = dataPadd;
            for (int x = 0; x < iWidthMark; ++x, mark_data += iChannelMark, padd_data += iChannelPadd)  
            {  
                //  Set watermark to special position
                *(padd_data + 2) = *(mark_data + 2);
                *(padd_data + 1) = *(mark_data + 1);
                *(padd_data) = *(mark_data);
            }
        }
        Mat imgMarkOrigin = (0.8 * imgOriginal) + (0.2 * imgPaddingMark);
        imshow( titleMarkOrigin, imgMarkOrigin);
        
        int iRet = waitKey(30); // wait for 30 seconds
        if ( iRet == 27 ) { //press ESC to exit program
            imwrite( "mark_done.jpg", imgMarkOrigin );
            break;
        }
    }
作法很簡單,用一個Control Panel,控制浮水印的左上角座落位置,
可即時看到浮水印位置的變動結果,方便放到中意的地方
Loop做的就是根據Panel參數,把原本的Watermark,放到與原圖同Size的Padding區域裡
之後就一樣,同樣Size的Blending function解決~
另外,按ESC離開後,會自動儲存結果mark_done.jpg到目錄下
以下秀點成果:

(縱使在手臂也清楚可見,不干擾)

(在右上角的牆壁與深色壁櫥也No Problem!)

(充當馬賽克屏蔽喔喔喔喔喔喔喔)


實作參考 與 連結

程式碼實作參考


    一句後洗洗睡

    雖然瞬解有點空虛,不過移動浮水印還是小確幸,謝天謝地,趕著去做其他期末專案了!

    1 則留言:

    1. Hard Rock Casino and Resort – Dr.D.C.
      Hard 제주 출장샵 Rock Hotel and Casino. 3131 South 경주 출장샵 Flamingo Drive, Las Vegas, NV 89109. 안성 출장샵 Phone: (702) 광주광역 출장마사지 321-7263. Casino. 상주 출장샵 More information. Hours, Accepts Credit Cards, Accepts

      回覆刪除