<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
emmm…9月1日開學季,手頭只有紅底證件照,但是學院要求要藍底,這可咋辦呢。懶得下ps了。自己擼起來吧。
lableme標註完後。得到一個json檔案,然後將這種json檔案轉成掩碼圖.
# 程式碼來自 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來區分是否為影象背景。
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)
結果人與背景邊緣仍會存在紅色畫素殘留
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是閾值,超引數 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))
該方法質量較好,但一張圖片大概需要12秒。
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的顏色拾取器(或者微信截圖,或者一些線上工具,例如菜鳥工具),得到十六進位制,再用線上轉換工具轉成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)具體深淺可以調節一下RGB,就是
com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
總結: 其實這種方法從 任何顏色的照片 都可以 換成任何顏色的底。只要換下RGB.
然後就輸出圖片了。可以看到效果相當好。不愧是oral。
原論文可以實現髮絲級效果
報錯解決方案
can’t divided by 4 / can’t divided by 16
由於該骨幹模型可能進行4倍或16倍下取樣,因此如果您的證件照不是該倍數的話,有兩種選擇方案。一種是padding, 填充後再送入模型,然後出結果後再用clip函數裁剪。另一種方式是resize, 給resize到規定倍數的寬和高。
這兩種方案需要的程式碼都可以從這篇博文找到: python影象填充與裁剪/resize
到此這篇關於python將紅底證件照轉成藍底的文章就介紹到這了,更多相關python證件照轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45