小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python提取支付寶和微信支付二維碼

 風(fēng)聲之家 2019-07-19
  1. 來源:

  2. https://www.zmrenwu.com/post/86/

支付寶或者微信支付導(dǎo)出的收款二維碼,除了二維碼部分,還有很大一塊背景圖案,例如下面就是微信支付的收款二維碼:

有時(shí)候我們僅僅只想要圖片中間的方形二維碼部分,為了提取出中間部分,我們可以使用圖片處理軟件,但圖片處理軟件不利于批處理,且學(xué)習(xí)也需要一定成本。本文將教你使用 Python 的圖像處理庫 pillow,輕松批量提取圖片中間的方形二維碼部分。

提取思路

以微信支付收款碼圖片為例:

分析圖片我們可以看到,二維碼位于白色背景中,而白色背景又位于綠色背景上。我們以圖片左上角為坐標(biāo)原點(diǎn),橫向?yàn)?x 軸(向右為正方向),縱向?yàn)?y 軸(向下為正方向)。我們的目標(biāo)是需要確定白色背景部分 4 個(gè)角的坐標(biāo)。

從圖片左邊正中向右橫向穿過,當(dāng)背景色從綠色變?yōu)榘咨珪r(shí),該點(diǎn)所在位置的橫坐標(biāo)即為左上角和左下角的橫坐標(biāo),記為 x_left。

同理從圖片右邊正中向左橫向穿過,當(dāng)背景色從綠色變?yōu)榘咨珪r(shí),該點(diǎn)所在位置的橫坐標(biāo)即為右上角和右下角的橫坐標(biāo),記為 x_right。

則白色背景寬度和高度為 h = xright - xleft。

再從綠色背景轉(zhuǎn)為白色背景時(shí)的點(diǎn)向上(或者向下,此處以向上為例)出發(fā),當(dāng)背景色從白色又變?yōu)榫G色時(shí),該點(diǎn)所在位置的縱坐標(biāo)即為左上角和右上角的縱坐標(biāo),記為 y_top。

則可以計(jì)算出左下角和右下角的縱坐標(biāo)為 (y_top + h)。

由此,白色背景部分 4 個(gè)角的坐標(biāo)均確定,分別為(從左上角開始順時(shí)針):(xleft, ytop)、(xright, ytop)、(xright, ytop+h)、(xleft, ytop+h)。

代碼實(shí)現(xiàn)

有了上述思路,我們就可以輕松寫出 Python 腳本了。代碼中給出了詳細(xì)注釋,其基本思路就是導(dǎo)入圖片,將其轉(zhuǎn)為一個(gè)二維矩陣,矩陣的元素為圖片對應(yīng)像素點(diǎn)的 RGBA 值,然后根據(jù) RGBA 值的變化(即顏色的變化)確定待裁剪邊界即可。

  1. import glob

  2. from PIL import Image

  3. if __name__ == '__main__':

  4. filenames = glob.glob('*.png') # 微信支付收款碼導(dǎo)出為 png 格式

  5. filenames.extend(glob.glob('*.jpg')) # 支付寶收款碼導(dǎo)出為 jpg 格式

  6. for filename in filenames:

  7. with Image.open(filename) as img:

  8. img.convert('RGBA')

  9. pix_data = img.load()

  10. # 圖片左上角為原點(diǎn),橫向?yàn)?x 軸(向右為正方向),縱向?yàn)?y 軸(向下為正方向)

  11. width, height = img.size # 圖片寬和高

  12. mid_height = height // 2 # 圖片正中縱坐標(biāo)

  13. # 確定左邊界橫坐標(biāo):

  14. x_left = 0

  15. for x in range(width):

  16. rgba = pix_data[x, mid_height]

  17. if rgba[:3] == (255, 255, 255):

  18. x_left = x

  19. break

  20. # 確定右邊界橫坐標(biāo):

  21. x_right = width - 1 # 右邊界

  22. for x in range(width - 1, 0, -1):

  23. rgba = pix_data[x, mid_height]

  24. if rgba[:3] == (255, 255, 255):

  25. x_right = x

  26. break

  27. h = x_right - x_left # 白色背景高度(正方形)

  28. mid_height_rgba = pix_data[x_left, mid_height]

  29. if filename.endswith('png'):

  30. # 微信支付往下確定下邊界縱坐標(biāo),因?yàn)楫?dāng)設(shè)置了收款金額時(shí),金額顯示在上方

  31. y_bottom = mid_height

  32. for y in range(mid_height, height):

  33. rgba = pix_data[x_left, y]

  34. if rgba != mid_height_rgba:

  35. y_bottom = y

  36. break

  37. box = (x_left, y_bottom - h, x_right, y_bottom)

  38. else:

  39. # 支付寶往上確定上邊界縱坐標(biāo),因?yàn)楫?dāng)設(shè)置了收款金額時(shí),金額顯示在下方

  40. y_top = mid_height

  41. for y in range(mid_height, 0, -1):

  42. rgba = pix_data[x_left, y]

  43. if rgba != mid_height_rgba:

  44. y_top = y

  45. break

  46. box = (x_left, y_top, x_right, y_top + h)

  47. crop = img.crop(box) # box 參數(shù)為四元組,分別為左上角和右下角的橫縱坐標(biāo)

  48. crop.save('./result/{}'.format(filename))

腳本代碼同時(shí)上傳在 GitHub,使用方法請看 README 文檔即可。腳本源碼倉庫:https://github.com/zmrenwu/clip-pay-pic

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多