最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python將紅底證件照轉(zhuǎn)成藍底的實現(xiàn)方法

 更新時間:2022年08月31日 11:12:47   作者:Andy?Dennis  
這篇文章主要介紹了python將紅底證件照轉(zhuǎn)成藍底,本文給大家分享四種方法通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

emmm…9月1日開學(xué)季,手頭只有紅底證件照,但是學(xué)院要求要藍底,這可咋辦呢。懶得下ps了。自己擼起來吧。

方法一: lableme

lableme標注完后。得到一個json文件,然后將這種json文件轉(zhuǎn)成掩碼圖.

# 代碼來自 https://blog.csdn.net/hello_dear_you/article/details/120130155
import json
import numpy as np
import cv2
# read json file
with open("origin_json/mypic.json", "r") as f:
    data = f.read()
 
# convert str to json objs
data = json.loads(data)
 
# get the points 
points = data["shapes"][0]["points"]
points = np.array(points, dtype=np.int32)   # tips: points location must be int32
 
# read image to get shape
image = cv2.imread("origin_png/person.jpg")
 
# create a blank image
mask = np.zeros_like(image, dtype=np.uint8)
 
# fill the contour with 255
cv2.fillPoly(mask, [points], (255, 255, 255))
 
# save the mask 
cv2.imwrite("mask/person_mask.png", mask)

大概是這樣:

然后利用這個mask生成圖片

# 參考自: https://www.jianshu.com/p/1961aa0c02ee
import cv2
import numpy as np
origin_png = 'origin_png/person.jpg'
# maskPath = 'mask/person_mask.png'
maskPath = 'mask/bmv2.png'
result_png = 'result_png/result_png.png'
maskImg = cv2.imread(maskPath)
img = cv2.imread(origin_png)
assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'

h, w = img.shape[0], img.shape[1]
print('圖片寬度: {}, 高度: {}'.format(h, w))

rgb = (19,122,171)
bgr = (rgb[2], rgb[1], rgb[0])
# (B, G, R)
for i in range(h):
    for j in range(w):
        if (maskImg[i, j] == 0).all():
            img[i, j] = bgr
cv2.imwrite(result_png, img)
print('圖片寫入 {} 成功'.format(result_png))

由于人長得一般,就不放圖了…

缺點:
lableme標注時挺費力,并且難以避免人與背景邊緣會有殘留紅色像素的情況。

方法二: 閾值

該方法通過比較像素的RGB與背景的RGB來區(qū)分是否為圖像背景。

Opencv

import cv2
import numpy as np
def mean_square_loss(a_np, b_np):
    sl = np.square(a_np - b_np)
    return np.mean(sl)
def change_red2blue(origin_png, result_png):
    img = cv2.imread(origin_png)
    h, w = img.shape[0], img.shape[1]
    print('圖片寬度: {}, 高度: {}'.format(h, w))
    origin_rgb = (168,36,32)  # 可以用瀏覽器啥的控制臺工具提取出背景的rgb值
    origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
    target_rgb = (19,122,171) # 藍底RBG
    target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])
    for i in range(h):
        for j in range(w):
            # (B, G, R)
            if mean_square_loss(img[i, j], origin_bgr) < 50:
                img[i, j] = target_bgr 
    cv2.imwrite(result_png, img)
    print('圖片寫入 {} 成功'.format(result_png))
if __name__ == '__main__':
    # origin_png = 'result_png/result_png.png'
    origin_png = 'origin_png/person.jpg'
    result_png = 'result_png/result_refine.png'
    change_red2blue(origin_png, result_png)

結(jié)果人與背景邊緣仍會存在紅色像素殘留

PIL

from torchvision.transforms.functional import to_tensor, to_pil_image
from PIL import Image
import torch
import time
def mean_square_loss(a_ts, b_ts):
    # print(a_ts.shape)
    # print(b_ts)
    sl = (a_ts - b_ts) ** 2
    return sl.sum()
def change_red2blue(origin_png, result_png):
    src = Image.open(origin_png)
    src = to_tensor(src)
    # print(src.shape)  # torch.Size([3, 800, 600])
    # channel: (R, G, B) / 255
    h, w = src.shape[1], src.shape[2]

    pha = torch.ones(h, w, 3)

    bg = torch.tensor([168,36,32]) / 255
    target_bg = torch.tensor([19,122,171]) / 255

    # C, H, W -> H, W, C
    src = src.permute(1, 2, 0)
    for i in range(h):
        for j in range(w):
            if mean_square_loss(src[i][j], bg) < 0.025: # 0.025是閾值,超參數(shù)
                pha[i][j] = torch.tensor([0.0, 0.0, 0.0])

    # H, W, C -> C, H, W
    src = src.permute(2, 0, 1)
    pha = pha.permute(2, 0, 1)
    com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)
    to_pil_image(com).save(result_png)
if __name__ == '__main__':
    origin_png = 'origin_png/person.jpg'
    result_png = 'result_png/com.png'
    start_time = time.time()
    change_red2blue(origin_png, result_png)
    spend_time = round(time.time() - start_time, 2)
    print('生成成功,共花了 {} 秒'.format(spend_time))

該方法質(zhì)量較好,但一張圖片大概需要12秒。

方法三: Background MattingV2

Real-Time High-Resolution Background Matting
CVPR 2021 oral

論文:https://arxiv.org/abs/2012.07810
代碼:https://github.com/PeterL1n/BackgroundMattingV2

github的readme.md有inference的colab鏈接,可以用那個跑

由于這篇論文是需要輸入一張圖片(例如有人存在的草地上)和背景圖片的(如果草地啥的), 然后模型會把人摳出來。

于是這里我需要生成一個背景圖片。
首先我先借助firefox的顏色拾取器(或者微信截圖,或者一些在線工具,例如菜鳥工具),得到十六進制,再用在線轉(zhuǎn)換工具轉(zhuǎn)成rgb。

然后生成一個背景圖片。

import cv2
import numpy as np
image = cv2.imread("origin_png/person.jpg")
origin_rgb = (168,36,32)  # 可以用瀏覽器啥的控制臺工具提取出背景的rgb值
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
image[:, :] = origin_bgr
cv2.imwrite("mask/bg.png", image)

需要上傳人的照片和背景照片, 如果名字和路徑不一樣則需要修改一下代碼

src = Image.open('src.png')
bgr = Image.open('bgr.png')

另外原論文是邊綠底,要變藍底,白底,紅底則可以修改RGB值,舉個例子,原來是這樣的(綠底, RGB120, 255, 155)

com = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)

那么加入我要換白底(255, 255, 255),就是

com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)

假如像我換藍底(19,122,171)具體深淺可以調(diào)節(jié)一下RGB,就是

com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)

總結(jié): 其實這種方法從 任何顏色的照片 都可以 換成任何顏色的底。只要換下RGB.

然后就輸出圖片了??梢钥吹叫Ч喈敽谩2焕⑹莖ral。

原論文可以實現(xiàn)發(fā)絲級效果

報錯解決方案
can’t divided by 4 / can’t divided by 16
由于該骨干模型可能進行4倍或16倍下采樣,因此如果您的證件照不是該倍數(shù)的話,有兩種選擇方案。一種是padding, 填充后再送入模型,然后出結(jié)果后再用clip函數(shù)裁剪。另一種方式是resize, 給resize到規(guī)定倍數(shù)的寬和高。
這兩種方案需要的代碼都可以從這篇博文找到: python圖像填充與裁剪/resize

到此這篇關(guān)于python將紅底證件照轉(zhuǎn)成藍底的文章就介紹到這了,更多相關(guān)python證件照轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中的數(shù)據(jù)可視化matplotlib與繪圖庫模塊

    Python中的數(shù)據(jù)可視化matplotlib與繪圖庫模塊

    這篇文章介紹了Python中的數(shù)據(jù)可視化matplotlib與繪圖庫模塊,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 深入探究Flask的兩個高級特性之藍圖和JWT認證

    深入探究Flask的兩個高級特性之藍圖和JWT認證

    本文將探討 Flask 的兩個高級特性:藍圖(Blueprints)和 JSON Web Token(JWT)認證,藍圖讓我們可以將應(yīng)用模塊化,以便更好地組織代碼;而 JWT 認證是現(xiàn)代 Web 應(yīng)用中常見的一種安全機制,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • Python實現(xiàn)無痛修改第三方庫源碼的方法詳解

    Python實現(xiàn)無痛修改第三方庫源碼的方法詳解

    很多時候,我們下載的 第三方庫 是不會有需求不滿足的情況,但也有極少的情況,第三方庫 沒有兼顧到需求,本文將介紹幾個修改源碼的操作,大家可以根據(jù)需求進行選擇
    2025-03-03
  • Django中模版的子目錄與include標簽的使用方法

    Django中模版的子目錄與include標簽的使用方法

    這篇文章主要介紹了Django中模版的子目錄與include標簽的使用方法,有利于Python的Django框架的模版布局,需要的朋友可以參考下
    2015-07-07
  • 再談Python中的字符串與字符編碼(推薦)

    再談Python中的字符串與字符編碼(推薦)

    這篇文章主要介紹了再談Python中的字符串與字符編碼(推薦),具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • 基于Pytorch的神經(jīng)網(wǎng)絡(luò)之Regression的實現(xiàn)

    基于Pytorch的神經(jīng)網(wǎng)絡(luò)之Regression的實現(xiàn)

    本文主要介紹了基于Pytorch的神經(jīng)網(wǎng)絡(luò)之Regression的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • allure結(jié)合python生成測試報告教程

    allure結(jié)合python生成測試報告教程

    這篇文章主要介紹了allure結(jié)合python生成測試報告教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python numpy數(shù)組復(fù)制使用實例解析

    python numpy數(shù)組復(fù)制使用實例解析

    這篇文章主要介紹了python numpy數(shù)組復(fù)制使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Python新手學(xué)習(xí)裝飾器

    Python新手學(xué)習(xí)裝飾器

    在本篇文章里小編給大家整理的是一篇關(guān)于Python裝飾器的相關(guān)知識點內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • 一文帶你玩轉(zhuǎn)Python屬性和方法

    一文帶你玩轉(zhuǎn)Python屬性和方法

    Python是一種簡潔而強大的編程語言,其支持面向?qū)ο蟮木幊谭妒?,本文將從入門到精通介紹Python中的屬性和方法,幫助大家深入了解這些重要的概念,并學(xué)會如何在實際開發(fā)中靈活應(yīng)用它們
    2023-07-07

最新評論

精河县| 景德镇市| 彝良县| 旬邑县| 彰化县| 徐闻县| 玉溪市| 建昌县| 聊城市| 攀枝花市| 和平区| 揭西县| 陕西省| 喀喇| 屏山县| 天门市| 宁波市| 平利县| 永兴县| 台中县| 宝丰县| 新宾| 汉沽区| 津南区| 杂多县| 虞城县| 定结县| 库尔勒市| 扶绥县| 临邑县| 甘泉县| 读书| 和平区| 霍林郭勒市| 青海省| 泊头市| 玉山县| 定边县| 中卫市| 江华| 旬阳县|