alpha matte 获取边缘图像

代码

from PIL import Image
from scipy.ndimage.morphology import distance_transform_edt
import torch 
import numpy as np

pth = r"F:\software\vscode\project\bgm\v2\BackgroundMattingV2\data\VideoMatte240K_JPEG_SD\train\pha\0000\00000.jpg"
with Image.open(pth) as img:
    img = img.convert("1")  
    radius = 1
    # print(img.size) # (768, 432)
    img.save("black_white_img.jpg")
    np_img = np.array(img) # value: True or False

    origin_edt = distance_transform_edt(np_img)
    # print(np.max(origin_edt)) # 41.23105625617661
    # print(np.min(origin_edt)) # 0.0


    # origin_edt_img = Image.fromarray(origin_edt.astype(np.uint8))
    # origin_edt_img.save("origin_edt_img.jpg")
    pai_edt = distance_transform_edt(1-np_img)
    # print(np.max(pai_edt)) # 549.083782313774
    # print(np.min(pai_edt)) # 0.0

    # pai_edt_img = Image.fromarray(pai_edt.astype(np.uint8))
    # pai_edt_img.save("pai_edt_img.jpg")
    plus_edt = origin_edt + pai_edt
    # print(np.max(plus_edt)) # 549.083782313774
    # print(np.min(plus_edt)) # 1.0

    plus_edt[plus_edt > radius] = 0
    # print(np.max(plus_edt)) # 10.0
    # print(np.min(plus_edt)) # 0.0

    plus_edt[plus_edt > 0] = 1
    # print(np.max(plus_edt))  # 1
    # print(np.min(plus_edt))  # 0

    plus_edt *= 255
    # print(np.max(plus_edt))  # 255
    # print(np.min(plus_edt))  # 0

    plus_edt = plus_edt.astype(np.uint8)
    # print(plus_edt.dtype) # uint8
    plus_edt_img = Image.fromarray(plus_edt)
    plus_edt_img.save("plus_edt_img.jpg")
    

alpha 图片:
alpha图
边缘图片:
边缘图片
alpha时0到1的值,包含中间的值,比如0.5。
img.convert(“1”) 把图片转换成数值只有True or False的图片。
distance_transform_edt 用于计算非零值到最近的零值的距离,最小值为0,代表本身是0值,如果是边缘像素(本身是非零,隔壁,左或右或上或下是零这样的情况),distance_transform_edt 值为1,内部的像素的distance_transform_edt 就是大于1。
至于为什么要img求一下distance_transform_edt , 1-img也求一下distance_transform_edt ,然后这两个distance_transform_edt 相加,简单来说就是为了让边缘更丰满的同时也让边缘的位置更准确,只算一个distance_transform_edt , 比如只算img的distance_transform_edt ,然后,非零的值只是在人物的内部,如果要获取边缘,那么最外围的是轮廓,如果让边缘更加丰满,只能往内扩展,那么这个边缘的中心就会往内部偏移。下图是同时算两个distance_transform_edt 的示例图:
edt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值