python opencv实现图像生成bump map凹凸贴图

bump map凹凸贴图和normal map法线贴图是计算机图形学中的重要概念,在图形渲染中应用广泛。其在图形学中具体含义可以参考:

  1. bump map VS normal map
  2. bump/normal/displacement
  3. 区别

bump map原理论文为:Simulation of Wrinked Surfaces
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中,B为输入的图像,Bu和Bv分别对应是图像B的u/v方向的梯度图像。即图像边缘检测中的x/y方向边缘图像。
基于python和opencv实现输入图像的bump map计算,笔者复现代码如下,欢迎大家批评指正。

def CalcBumpmap():

    def ConvMatrix(data, kernel):
        dst = cv2.filter2D(data, -1, kernel)
        return dst

    def Rescale(data):
        minV = np.min(data)
        maxV = np.max(data)

        data = (data - minV) / (maxV - minV)

        return data

    def Bumpmap(img):

        H,W = img.shape
        bumpmap = np.zeros((H,W,3))

        img = img.astype(np.float)
        kernelNx = np.array([[0, 0, 0], [0, -1, 1], [0, 0, 0]], dtype=np.float)  # [0, 1, 0], [0,-1,0], [0, 0, 0]
        kernelNy = np.array([[0, 0, 0], [0, -1, 0], [0, 1, 0]],
                            dtype=np.float)  # [0, 0, 0], [1, -1, 0], [0, 0, 0]  按此计算效果最好
        Xgradient = ConvMatrix(img, kernelNx)
        Ygradient = ConvMatrix(img, kernelNy)

        Xgradient = Rescale(abs(Xgradient))
        Ygradient = Rescale(abs(Ygradient))

        bumpnorm = np.sqrt(Xgradient ** 2 + Ygradient ** 2 + 1)

        bumpmap[:, :, 0] = Xgradient / bumpnorm
        bumpmap[:, :, 1] = Ygradient / bumpnorm
        bumpmap[:, :, 2] = 1 / bumpnorm
        return bumpmap

    imglists = glob.glob('./*.png')
    lens = len(imglists)
    plt.figure()
    plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.001, hspace=0.3)
    for img_id,item in enumerate(imglists):
        img = cv2.imread(item)

        b,g,r = cv2.split(img)

        b_bumpmap = Bumpmap(b)
        g_bumpmap = Bumpmap(g)
        r_bumpmap = Bumpmap(r)

        # bumpmap = b_bumpmap + g_bumpmap + r_bumpmap

        bumpmap = np.maximum(b_bumpmap,g_bumpmap,r_bumpmap)

        bumpnorm = np.sqrt(np.sum(bumpmap**2,axis=2))

        bumpmap[:, :, 0] = bumpmap[:, :, 0] / bumpnorm
        bumpmap[:, :, 1] = bumpmap[:, :, 1] / bumpnorm
        bumpmap[:, :, 2] = bumpmap[:, :, 2] / bumpnorm

        bumpmap = bumpmap / 2 + 0.5  # 下限0.5,保证整体色调

        plt.subplot(lens,2,2*img_id+1)
        plt.imshow(img)
        plt.title(item)
        plt.subplot(lens,2,2*img_id+2)
        plt.imshow(bumpmap)
        plt.title(item+'-bumpmap')

    plt.show()

bump map转换效果如下:
在这里插入图片描述
图形学中bump map和normal map深刻理解还有待于之后3D Max等三维建模渲染的实践,笔者是在基于光度立体的纹理缺陷检测中了解到bump map的概念。
在图像光度学分析中,bump map定义为表面实际法向量与表面理论法向量之差,概念示意图如下:
在这里插入图片描述
其中:
表面实际法向量由传统光度立体方法估计得到;
表面理论法向量由被测工件的标准CAD Model数据计算得到。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值