白紙不夠白,簽名照片還需要ps去除背景?Python大法半完美解決電子簽名背景問題(20行代碼去除簽名背景)

畢業季又來了,今年受疫情影響,畢業答辯基本都在網上進行。很多材料都需要電子簽名。由於受到紙張、光線和手機等外部環境的影響,並不是每個人都有完美的條件拍出比較好的簽名照片。本文主要是利用python來對簽名背景去除,提取簽名照片。

1. 存在的問題

電子簽名很多情況下都會用到,特別是今年疫情影響,很多材料都需要電子簽名,但是自己在家籤的名字總是不能讓人滿意,下面給出幾張籤的圖片讓大家看看。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上述三張圖片是我用家裏的稿子寫的。圖片中不僅僅存在紙張的問題,光線也比較昏暗,這種圖片當然不能夠直接的裁剪到論文或者相關材料中去,這就需要我們對背景進行處理。當然通過強大的PS工具可以完美實現這個功能。但是畢竟大多數人是一個PS小白(比如我)。那麼作爲程序員我們當然有自己獨特的方法了,下面介紹一個簡單的使用python實現的背景去除的功能。

2. 背景去除代碼

我僅僅使用了python中的Image庫來對圖片進行簡單的處理,當然如果使用強大的tup增強技術能夠達到更好的效果,但是。。。。。。。。。。這個不是我的研究內容,也沒有學習過,,所以就不進行操作了。下面首先給出python代碼。

#coding:utf-8
from PIL import Image
from PIL import ImageOps

def initTable(threshold=50):
    table = []
    for i in range(256):
        if i < threshold:
            table.append(1)
        else:
            table.append(0)
    return table
if __name__ == "__main__":
    image = Image.open("p1.jpg")
    # 轉化爲二值圖片
    imgry = image.convert('L')
    # 根據閾值將圖片的二值化像素值轉化爲01,理論上只需將簽名的像素設爲0,其它背景設爲1
    binary = imgry.point(initTable(), '1')
    print(binary)
    # 再次進行二值化
    im1 = binary.convert('L')
    im2 = ImageOps.invert(im1)
    im3 = im2.convert('1')
    im4 = im3.convert('L')
    im4.show()

上述僅僅是一個簡單的測試代碼,寫的並不美觀,大家就不要在意一個形式問題了,代碼中有具體的註釋,就不進行具體的介紹。總體來說就是將圖片讀取之後,將其轉化爲二值圖片,那麼圖片本質上就一個二維矩陣,其中每一個值都是0-255之間,那麼我們現在需要將其中的簽名部分,也就是黑色部分(這裏我們的簽名僅僅指的是黑色)賦值爲0,其餘部分設置爲1。

關鍵就在於設置閾值,由於不同環境拍出的照片背景色的像素值不固定,簽名的像素值也不一定,所以需要自己調整,這裏我僅僅給出參考。

3. 測試結果

我們將第一節中的幾張圖片進行了測試,去除背景後的圖片如下所示:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
需要注意的是,每張圖片的閾值都不相同,但基本上在50-90之間,不同的圖片需要進行不同的嘗試。



如果喜歡的大家可以直接拿去用o,覺得有用的話希望關注、收藏和點贊哦。

如果喜歡的話希望點贊收藏,關注我,將不間斷更新博客。

希望熱愛技術的小夥伴私聊,一起學習進步

來自於熱愛編程的小白

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章