<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Python去除圖片水印,太神奇了!

          共 2466字,需瀏覽 5分鐘

           ·

          2021-09-11 02:27


          可不可使用Python去除圖片水印呢?

          由于圖片水印的種類有很多,今天我們先講最簡(jiǎn)單的一種。

          即上圖中的①類水印,這種水印存在白色背景上的文檔里,水印是灰色,需要保留的文字是黑色。

          這種通常可以進(jìn)行簡(jiǎn)單的亮度/對(duì)比度轉(zhuǎn)換,直到水印消失并降低亮度以進(jìn)行補(bǔ)償[1]。參考別人的方法,我發(fā)現(xiàn)可以用多種方法去除水印。大致原理比較相似,下面先講OpenCV的方法。

          OpenCV + Numpy

          本方法需要使用的庫(kù):cv2、numpy。cv2是基于OpenCV的圖像處理庫(kù),可以對(duì)圖像進(jìn)行腐蝕,膨脹等操作;Numpy這是一個(gè)強(qiáng)大的處理矩陣和維度運(yùn)算的庫(kù)。

          函數(shù)簡(jiǎn)介

          介紹一下cv2的三個(gè)基本函數(shù):使用cv2.imread()cv2.imshow()cv2.imwrite()分別可以讀取、顯示和保存圖像。

          img = cv2.imread('test.png')

          cv2.imshow('test.png',img)
          cv2.waitKey(0)

          cv2.imwrite('test_2.png', img)

          對(duì)于Numpy呢,則要用到np.clip(),它是一個(gè)截取函數(shù),用于截取數(shù)組中小于或者大于某值的部分,并使得被截取部分等于固定值。

          np.clip(a, a_min, a_max, out=None):

          具體用法:

          可以看到,數(shù)組x中的所有數(shù)限定到范圍0和5之間。為啥要介紹這些函數(shù)呢,接著往下看。

          色彩轉(zhuǎn)換

          回到本文一開始,我們想去除文檔圖片中的水印。

          上圖中我選取了三個(gè)點(diǎn),這三個(gè)像素點(diǎn)分別對(duì)應(yīng)背景白色、黑色字體以及灰色的水印。

          我們現(xiàn)在要做的事,就是想辦法把水印轉(zhuǎn)換成白色背景。換言之,就是把圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。

          當(dāng)然這個(gè)[217,217,217]也不是固定的,只是一個(gè)范圍。為了方便調(diào)整,我選取了一些像素點(diǎn),做了一個(gè)線性回歸。

          希望把圖片整體的像素顏色做一個(gè)改變,原有黑色字體盡量跟原來(lái)一致,而水印部分則一定要≥255,然后就可以通過(guò)np.clip()限定區(qū)間,使之都變成[255,255,255]。

          說(shuō)干就干

          import cv2
          import numpy as np

          img = cv2.imread('test.png')

          new = np.clip(1.4057577998008846*img-38.330899996530170255).astype(np.uint8)

          cv2.imwrite('removed.png', new)

          下面我們看看調(diào)整后的效果(左側(cè)是轉(zhuǎn)換前,右側(cè)是轉(zhuǎn)換后)。

          左:轉(zhuǎn)換前 右:轉(zhuǎn)換后

          處理效果還是不錯(cuò)的,說(shuō)明對(duì)于這類文檔圖片水印,通過(guò)幾行Python代碼就可以輕松去除水印。

          不過(guò)通過(guò)線性回歸改變整體圖片顏色,也會(huì)影響原有的黑色文本,導(dǎo)致其顏色發(fā)生了微微變化。

          那我們能不能簡(jiǎn)單粗暴一點(diǎn)!只改變水印的顏色呢?

          也可以試試。

          PIL  + itertools

          PIL也是一個(gè)Python 圖像處理庫(kù),其中Image模塊是在Python PIL圖像處理中常見(jiàn)的模塊,對(duì)圖像進(jìn)行基礎(chǔ)操作的功能基本都包含于此模塊內(nèi)。

          itertools 之前更是被我們稱為一個(gè)零差評(píng)的 Python 內(nèi)置庫(kù)。其中itertools.product用來(lái)產(chǎn)生多個(gè)列表和迭代器的(積)。

          還是跟之前一個(gè)原理,我們希望將圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。

          那就簡(jiǎn)單粗暴一點(diǎn),也就是像素值相加大概600(217+217+217)以上的像素點(diǎn),都改成[255,255,255]就好了。

          from itertools import product
          from PIL import Image

          img = Image.open('test.png')
          width, height = img.size
          for pos in product(range(width), range(height)):
              if sum(img.getpixel(pos)[:3]) > 600:
                  img.putpixel(pos, (255,255,255))
          img.save('removed_1.png')

          運(yùn)行結(jié)果,對(duì)比一下。

          左:轉(zhuǎn)換前 右:轉(zhuǎn)換后

          與第一種方法對(duì)比,肉眼也沒(méi)看出來(lái)太明顯差別。

          那大家就喜歡那種方法就用哪個(gè)吧!

          參考資料

          [1]

          How to remove watermark background in image Python: https://stackoverflow.com/questions/50792812/how-to-remove-watermark-background-in-image-python?answertab=oldest#tab-top


          往期推薦

          1、10 個(gè)“瘋狂”的 Python 項(xiàng)目創(chuàng)意

          2視頻剪輯什么鬼?Python 帶你高效創(chuàng)作短視頻

          3我用 Selenium 爬了京東商城,結(jié)果……

          4、一條命令搭建私人網(wǎng)盤,太贊了(留言送書)

          5、字節(jié)員工炸鍋,薪資普降17%!

          今天因?yàn)槟狞c(diǎn)贊和在看,讓我元?dú)鉂M滿!

          瀏覽 103
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日天天操天天色 | 在线日韩亚洲中文字幕av | 免费看日本一级片 | 国产免费91 | 久久久久久黄色 |