matting之trimap生成_膨胀腐蚀

在抠图技术中三分图(trimap)经常被用到,通常使用的方法是膨胀腐蚀(一般在去除噪声的时候先腐蚀再膨胀)。

1.

import os
import numpy as np
import cv2

def random_dilate(alpha, low=1, high=5, mode='constant'):
    """Dilation. erode"""
    iterations = np.random.randint(1, 20)
    erode_ksize = np.random.randint(low=low, high=high)
    dilate_ksize = np.random.randint(low=low, high=high)
    erode_kernel = cv2.getStructuringElement(
        cv2.MORPH_ELLIPSE, (erode_ksize, erode_ksize)) # 椭圆 (尺寸)
    dilate_kernel = cv2.getStructuringElement(
        cv2.MORPH_ELLIPSE, (dilate_ksize, dilate_ksize))
    alpha_eroded = cv2.erode(alpha, erode_kernel, iterations=iterations)
    alpha_dilated = cv2.dilate(alpha, dilate_kernel, iterations=iterations)
    if mode == 'constant':
        alpha_noise = 128 * np.ones_like(alpha)
        alpha_noise[alpha_eroded >= 255] = 255 ###250
        alpha_noise[alpha_dilated <= 0] = 0
    else:
        value = np.random.randint(low=100, high=255)
        alpha_noise = value * ((alpha_dilated - alpha_eroded) / 255.)
        alpha_noise += alpha_eroded
    return alpha_noise

2.

def erode_dilate(msk, struc="ELLIPSE", size=(10, 10)):
    if struc == "RECT":
        kernel = cv2.getStructuringElement(cv2.MORPH_RECT, size)
    elif struc == "CORSS":
        kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, size)
    else:
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, size)

    #msk = msk.astype(np.float32)
    #print(msk)
    msk = msk / 255
    #print(msk.shape)

    #msk = msk.astype(np.uint8)

    # val in 0 or 255
    iterations = 3
    dilated = cv2.dilate(msk, kernel, iterations=iterations) * 255
    eroded = cv2.erode(msk, kernel, iterations=iterations) * 255 # 腐蚀
    # 一般在去噪声时先用腐蚀再用膨胀。

    # cnt1 = len(np.where(msk >= 0)[0])
    # cnt2 = len(np.where(msk == 0)[0])
    # cnt3 = len(np.where(msk == 1)[0])
    # #print("all:{} bg:{} fg:{}".format(cnt1, cnt2, cnt3))
    # assert(cnt1 == cnt2 + cnt3) # 边缘模糊所以存在两者之间的像素
    #
    # cnt1 = len(np.where(dilated >= 0)[0])
    # cnt2 = len(np.where(dilated == 0)[0])
    # cnt3 = len(np.where(dilated == 255)[0])
    # #print("all:{} bg:{} fg:{}".format(cnt1, cnt2, cnt3))
    # assert(cnt1 == cnt2 + cnt3)
    #
    # cnt1 = len(np.where(eroded >= 0)[0])
    # cnt2 = len(np.where(eroded == 0)[0])
    # cnt3 = len(np.where(eroded == 255)[0])
    # #print("all:{} bg:{} fg:{}".format(cnt1, cnt2, cnt3))
    # assert(cnt1 == cnt2 + cnt3)

    res = dilated.copy()
    #res[((dilated == 255) & (msk == 0))] = 128
    res[((dilated == 255) & (eroded == 0))] = 128 # alpha

    return res

一些细节上的处理,导致结果有些不同,根据数据的实际情况,灵活运用,酌情修改


更新

from scipy.ndimage import morphology    
def getTrimap(self, alpha):
	fg = np.array(np.equal(alpha, 255).astype(np.float32))
	unknown = np.array(np.not_equal(alpha, 0).astype(np.float32))  # unknown = alpha > 0
	unknown = unknown - fg
	unknown = morphology.distance_transform_edt(unknown == 0) <= np.random.randint(1, 20)
	trimap = fg
	trimap[unknown] = 0.5
	# print(trimap[:, :, :1].shape)
	return trimap[:, :, :1]

二次更新:

from scipy.ndimage import grey_dilation, grey_erosion
low, high = 2, 8  ### 根据具体情况再定义
d_size = np.random.randint(low=low, high=high)
e_size = np.random.randint(low=low, high=high)
matte = label / 255.  # $numpy array of your matte(with values between[0, 1])$

trimap = (matte >= 0.9).astype('float32')
not_bg = (matte > 0).astype('float32')

trimap[np.where(
    (grey_dilation(not_bg, size=(d_size, d_size)) - grey_erosion(trimap, size=(e_size, e_size))) != 0)] = 0.5

Reference:

Python - OpenCV 之图像形态学(膨胀与腐蚀)

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
adobe_deep_matting_dataset.zip是一个由Adobe提供的深度抠图数据集压缩文件。 深度抠图是一种图像处理技术,旨在将前景目标从原始图像中分割出来,以便将其置于不同的背景中。Adobe_deep_matting_dataset.zip数据集提供了广泛的图像样本,包括不同类型、场景和复杂度的图像,以帮助进行深度抠图算法的训练和评估。 这个数据集为研究者和开发者提供了一个宝贵的资源,用于深度学习模型的训练和评估。通过使用这个数据集,研究者可以开发出更加精确和高效的深度抠图算法,从而改善图像编辑、虚拟现实、增强现实等领域的用户体验。 在adobe_deep_matting_dataset.zip中,图像样本通常以图像文件和相应的标签文件的形式呈现。标签文件提供了有关每个图像的前景目标和其对应的抠图结果的信息。这些标签可以用来评估算法的性能并进行比较。 需要注意的是,使用这个数据集时,需要遵守Adobe提供的数据使用规范和条款。这包括但不限于不用于商业目的、不将数据集用于不良用途等。通过遵守这些规范,可以保证数据集的合法使用,同时对于开发者和研究者来说,也能够维护良好的研究道德和行业规范。 总之,adobe_deep_matting_dataset.zip是一个由Adobe提供的深度抠图数据集压缩文件,为研究者和开发者提供了用于深度学习算法训练和评估的宝贵资源。通过使用这个数据集,可以促进深度抠图技术的发展,提升用户在图像处理和增强现实等领域的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值