bump map凹凸贴图和normal map法线贴图是计算机图形学中的重要概念,在图形渲染中应用广泛。其在图形学中具体含义可以参考:
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数据计算得到。