当前位置:首页 » 《随便一记》 » 正文

python将红底证件照转成蓝底

23 人参与  2022年08月25日 16:50  分类 : 《随便一记》  评论

点击全文阅读


前言

emmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。



方法一: lableme

lableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.

# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/120130155import jsonimport numpy as npimport cv2# read json filewith open("origin_json/mypic.json", "r") as f:    data = f.read() # convert str to json objsdata = 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 shapeimage = cv2.imread("origin_png/person.jpg") # create a blank imagemask = np.zeros_like(image, dtype=np.uint8) # fill the contour with 255cv2.fillPoly(mask, [points], (255, 255, 255)) # save the mask cv2.imwrite("mask/person_mask.png", mask)

大概是这样:

然后利用这个mask生成图片

# 参考自: https://www.jianshu.com/p/1961aa0c02eeimport cv2import numpy as nporigin_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] = bgrcv2.imwrite(result_png, img)print('图片写入 {} 成功'.format(result_png))

由于人长得一般,就不放图了…

缺点:
lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。



方法二: 阈值

该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。

Opencv

import cv2import numpy as npdef 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)

结果人与背景边缘仍会存在红色像素残留



PIL

from torchvision.transforms.functional import to_tensor, to_pil_imagefrom PIL import Imageimport torchimport timedef 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秒。



方法四: 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的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。

然后生成一个背景图片。

import cv2import numpy as npimage = 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_bgrcv2.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


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/44711.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 小说江诗云路明哲小说已更新+番外篇章(年少的爱终将散去)纯净阅读
  • 真千金伪装大学生在自家公司实习让狗爬后一口气看完_宋氏小林小姑娘高分神作_小说后续在线阅读_无删减免费完结_
  • 萧逸尘,楚璃,叶紫嫣爱恨决绝,此生不见番外(爱恨决绝,此生不见)TXT+后续+结局在线阅读
  • 假千金要交换人生?我抱着空间做首富爽文_苏木青赵景城虐心反转_小说后续在线阅读_无删减免费完结_
  • 温时雨谢远之续集(清风难渡无缘人)全本完整免费版_起点章节+后续(温时雨谢远之)
  • 订婚两个月后,未婚夫要摆脱包办婚姻精心打造_肖明宝宝宾客故事会_小说后续在线阅读_无删减免费完结_
  • 霍景琛,苏晚,林深昔年请深如海,终不敌薄凉附加(霍景琛,苏晚,林深)(昔年请深如海,终不敌薄凉)全本浏览阅读连载中
  • 新章速递汤安甯,白子奕,汤贝贝是什么小说(结婚十年,回归家庭的老婆在外有二胎了)完本阅读无广告(结婚十年,回归家庭的老婆在外有二胎了)
  • 娇牛马导师偷我论文99篇成功升博导,我让他牢底坐穿精校文本_周老师师姐师兄爽文_小说后续在线阅读_无删减免费完结_
  • 独家顾宇,罗薇:结局+番外精编之作(资助生装阔气,我可不参加)电子书畅享阅读
  • 宗门全员重生,小师妹摆烂不干了(君拂君芙蓉)_宗门全员重生,小师妹摆烂不干了
  • 成了高考状元后,我倒欠两百万完结txt_阿姨叶青江安TOP10_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1