def _runImp(self): normal_data = loadNormal(self._data_file) if normal_data is None: return N0_32F, A_8U = normal_data #N0_32F = cv2.resize(N0_32F, (64, 64)) #A_8U = cv2.resize(A_8U, N0_32F.shape[:2]) A_32F = to32F(A_8U) L = normalizeVector(np.array([-0.2, 0.3, 0.7])) # C0_32F = ToonShader().diffuseShading(L, N0_32F) C0_32F = LambertShader().diffuseShading(L, N0_32F) sfs_method = Wu08SFS(L, C0_32F, A_8U) sfs_method.run() N_32F = sfs_method.normal() saveNormal(self.resultFile(self._data_file_name, result_name="Wu08"), N_32F, A_8U) C_error = sfs_method.shadingError() I_32F = sfs_method.brightness() I_32F = gray2rgb(I_32F) C_32F = sfs_method.shading() N0_32F = trim(N0_32F, A_8U) C0_32F = trim(C0_32F, A_8U) C_32F = trim(C_32F, A_8U) N_32F = trim(N_32F, A_8U) C_error = trim(C_error, A_8U) I_32F = trim(I_32F, A_8U) A_32F = trim(A_32F, A_8U) A_8U = trim(A_8U, A_8U) h, w = N_32F.shape[:2] N_error = angleErros(N_32F.reshape(-1, 3), N0_32F.reshape(-1, 3)).reshape(h, w) N_error[A_8U < np.max(A_8U)] = 0.0 fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 2 num_cols = 3 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(normalToColor(N0_32F, A_8U), r'Ground Truth Normal: $N_g$') plot_grid.showImage(normalToColor(N_32F, A_8U), r'Estimated Normal: $N$') plot_grid.showColorMap(N_error, r'Angle Error: $N_g, N$', v_min=0, v_max=30.0) plot_grid.showImage(setAlpha(C0_32F, A_32F), r'Shading: $C$') plot_grid.showImage(setAlpha(C_32F, A_32F), r'Estimated Shading: $C$') plot_grid.showColorMap(C_error, r'Shading Error: $C_g, C$', v_min=0, v_max=0.1) showMaximize()
def _runImp(self): normal_data = loadNormal(self._data_file) if normal_data is None: return N0_32F, A_8U = normal_data # N0_32F = cv2.resize(N0_32F, (64, 64)) # A_8U = cv2.resize(A_8U, N0_32F.shape[:2]) A_32F = to32F(A_8U) L = normalizeVector(np.array([-0.2, 0.3, 0.7])) # C0_32F = ToonShader().diffuseShading(L, N0_32F) C0_32F = LambertShader().diffuseShading(L, N0_32F) sfs_method = Wu08SFS(L, C0_32F, A_8U) sfs_method.run() N_32F = sfs_method.normal() saveNormal(self.resultFile(self._data_file_name, result_name="Wu08"), N_32F, A_8U) C_error = sfs_method.shadingError() I_32F = sfs_method.brightness() I_32F = gray2rgb(I_32F) C_32F = sfs_method.shading() N0_32F = trim(N0_32F, A_8U) C0_32F = trim(C0_32F, A_8U) C_32F = trim(C_32F, A_8U) N_32F = trim(N_32F, A_8U) C_error = trim(C_error, A_8U) I_32F = trim(I_32F, A_8U) A_32F = trim(A_32F, A_8U) A_8U = trim(A_8U, A_8U) h, w = N_32F.shape[:2] N_error = angleErros(N_32F.reshape(-1, 3), N0_32F.reshape(-1, 3)).reshape(h, w) N_error[A_8U < np.max(A_8U)] = 0.0 fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 2 num_cols = 3 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(normalToColor(N0_32F, A_8U), r"Ground Truth Normal: $N_g$") plot_grid.showImage(normalToColor(N_32F, A_8U), r"Estimated Normal: $N$") plot_grid.showColorMap(N_error, r"Angle Error: $N_g, N$", v_min=0, v_max=30.0) plot_grid.showImage(setAlpha(C0_32F, A_32F), r"Shading: $C$") plot_grid.showImage(setAlpha(C_32F, A_32F), r"Estimated Shading: $C$") plot_grid.showColorMap(C_error, r"Shading Error: $C_g, C$", v_min=0, v_max=0.1) showMaximize()
def _runLayer(self, layer_file): C0_8U = loadRGBA(layer_file) if C0_8U is None: return A_8U = alpha(C0_8U) # if A_8U is None: # return C0_32F = to32F(rgb(C0_8U)) I_32F = luminance(C0_32F) Lab_32F = rgb2Lab(C0_32F) th_specular = 0.2 th_contour = 0.02 th_material = 0.1 E_32F = DoG(I_32F, sigma=2.0) contour = th_contour * np.min(E_32F) - E_32F contour *= 1.0 / np.max(contour) contour = np.clip(contour, 0.0, 1.0) specular = E_32F - th_specular * np.max(E_32F) specular *= 1.0 / np.max(specular) specular = np.clip(specular, 0.0, 1.0) material = rgb(C0_8U) # edge_mask = np.zeros(I_32F.shape, dtype=np.uint8) # edge_mask[contour > 0.0] = 1.0 # material = cv2.inpaint(material, edge_mask, 3, cv2.INPAINT_TELEA) for i in xrange(1): material = cv2.medianBlur(material, ksize=7) # material = th_material * np.max(np.abs(E_32F)) - np.abs(E_32F) # material *= 1.0 / np.max(material) # material = np.clip(material, 0.0, 1.0) # material[material > 0.0] = 1.0 E_32F[E_32F < 0.0] = 0.0 fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(C0_8U, r'$C$') #plot_grid.showImage(setAlpha(C0_32F, material), r'$Material$') plot_grid.showImage(setAlpha(material, A_8U), r'$Material$') plot_grid.showImage(setAlpha(C0_32F, contour), r'$Contour$') plot_grid.showImage(setAlpha(C0_32F, specular), r'$Specular$') showMaximize()
def shapeList(): num_rows = 1 num_cols = len(shapeNames()) w = 20 h = w * num_rows / num_cols cmap_id = 10 colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) L = normalizeVector(np.array([-0.4, 0.5, 0.6])) fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) for shape_name in shapeNames(): Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data C0_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "") file_path = shapeResultFile("ShapeEstimation", "ShapeList") fig.savefig(file_path, transparent=True)
def colorMapFigure(): L = normalizeVector(np.array([-0.2, 0.3, 0.7])) N_32F, A_32F = normalSphere(h=512, w=512) fig, axes = plt.subplots(figsize=(6, 4)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02, hspace=0.1, wspace=0.1) fig.suptitle("", fontsize=font_size) num_rows = 4 num_cols = 6 plot_grid = SubplotGrid(num_rows, num_cols) for colormap_file in colorMapFiles(): M_32F = loadColorMap(colormap_file) C_32F = ColorMapShader(M_32F).diffuseShading(L, N_32F) plot_grid.showImage(setAlpha(C_32F, A_32F), "") file_path = os.path.join(colorMapResultsDir(), "ColorMapMaterials.png") fig.savefig(file_path, transparent=True)
def _runColorMap(self, colormap_file, Ng_32F, N0_32F, A_8U): M_32F = loadColorMap(colormap_file) L0 = normalizeVector(np.array([-0.2, 0.3, 0.6])) L0_img = lightSphere(L0) L0_txt = 0.01 * np.int32(100 * L0) C0_32F = ColorMapShader(M_32F).diffuseShading(L0, Ng_32F) I_32F = luminance(C0_32F) L = lightEstimation(I_32F, N0_32F, A_8U) L_txt = 0.01 * np.int32(100 * L) L_img = lightSphere(L) fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(setAlpha(C0_32F, A_8U), r'Input image: $\mathbf{c}$', font_size=font_size) plot_grid.showImage(normalToColor(N0_32F, A_8U), r'Initial normal: $\mathbf{N}_0$') plot_grid.showImage(L0_img, r'Ground trugh light: $L_g = (%s, %s, %s)$' %(L0_txt[0], L0_txt[1], L0_txt[2])) plot_grid.showImage(L_img, r'Estimated light: $L = (%s, %s, %s)$' %(L_txt[0], L_txt[1], L_txt[2])) showMaximize()
def materialList(): shape_name = "ThreeBox" num_rows = 1 num_cols = len(colorMapFiles()) w = 24 h = w * num_rows / num_cols L = normalizeVector(np.array([-0.4, 0.5, 0.6])) fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.1, wspace=0.05) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data for colormap_file in colorMapFilesSortedReflectanceError(): M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "") file_path = shapeResultFile("ShapeEstimation", "MaterialList") fig.savefig(file_path, transparent=True)
def bilateralSmoothing(image): sigma_xy = 0.1 xy = positionFeatures(image) / sigma_xy Lab = LabFeatures(image) foreground = foreGroundFeatures(image) Labxy = np.concatenate((Lab, xy), axis=1)[foreground, :] sigma_L = 1.0 Labxy[:, 0] = Labxy[:, 0] / sigma_L Labxy_sparse = shuffle(Labxy, random_state=0)[:1000] Lab_smooth = np.array(Lab) smooth = 0.0 L_rbf = Rbf(Labxy_sparse[:, 0], Labxy_sparse[:, 1], Labxy_sparse[:, 2], Labxy_sparse[:, 3], Labxy_sparse[:, 4], sigma_L * Labxy_sparse[:, 0], function='linear', smooth=smooth) a_rbf = Rbf(Labxy_sparse[:, 0], Labxy_sparse[:, 1], Labxy_sparse[:, 2], Labxy_sparse[:, 3], Labxy_sparse[:, 4], Labxy_sparse[:, 1], function='linear', smooth=smooth) b_rbf = Rbf(Labxy_sparse[:, 0], Labxy_sparse[:, 1], Labxy_sparse[:, 2], Labxy_sparse[:, 3], Labxy_sparse[:, 4], Labxy_sparse[:, 2], function='linear', smooth=smooth) #Lab_smooth[:, 0] = L_rbf(Labxy[:, 0], Labxy[:, 1], Labxy[:, 2], Labxy[:, 3], Labxy[:, 4]) Lab_smooth[foreground, 0] = L_rbf(*(Labxy.T)) Lab_smooth[foreground, 1] = a_rbf(*(Labxy.T)) Lab_smooth[foreground, 2] = b_rbf(*(Labxy.T)) h, w = image.shape[:2] Lab_smooth = Lab_smooth.reshape((h, w, 3)) rgb_smooth = Lab2rgb(np.float32(Lab_smooth)) rgb_smooth_8U = to8U(rgb_smooth) rgb_smooth_8U = setAlpha(rgb_smooth_8U, alpha(image)) return rgb_smooth_8U
def _runImp(self): normal_data = loadNormal(self._data_file) if normal_data is None: return N_32F, A_8U = normal_data N_32F = trim(N_32F, A_8U) A_8U = trim(A_8U, A_8U) A_32F = to32F(A_8U) L = normalizeVector(np.array([-0.2, 0.3, 0.7])) I_half = half_lambert.diffuse(N_32F, L) I_half = setAlpha(gray2rgb(I_half), A_32F) I_lambert = lambert.diffuse(N_32F, L) I_lambert = setAlpha(gray2rgb(I_lambert), A_32F) fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.05, wspace=0.05) fig.suptitle("Depth From Normal", fontsize=font_size) plt.subplot(1, 4, 1) plt.title(r'Normal: $N$') plt.imshow(normalToColor(N_32F, A_8U)) plt.axis('off') plt.subplot(1, 4, 2) plt.title(r'Half Lambert: $I_h$') plt.imshow(I_half) plt.axis('off') plt.subplot(1, 4, 3) plt.title(r'Lambert: $I_l$') plt.imshow(I_lambert) plt.axis('off') showMaximize()
def normalToColor(N_32F, A_8U=None): C_32F = 0.5 * N_32F + 0.5 C_8U = to8U(C_32F) if A_8U is not None: C_8U = setAlpha(C_8U, A_8U) return C_8U
def depthImage(self): D_min = np.min(self._depth) D_max = np.max(self._depth) D_32F = (self._depth - D_min) / (D_max - D_min) D_8U = to8U(D_32F) D_8U = gray2rgb(D_8U) A_8U = alpha(self._image) D_8U = setAlpha(D_8U, A_8U) return D_8U
def _runLayer(self, layer_file): C0_8U = loadRGBA(layer_file) if C0_8U is None: return A_8U = alpha(C0_8U) if A_8U is None: return C0_32F = to32F(rgb(C0_8U)) I_32F = luminance(C0_32F) N0_32F, A_8U = loadNormal( self.characterResultFile("N0_d.png", data_name="BaseDetailSepration")) Nd_32F, A_8U = loadNormal( self.characterResultFile("N_d_smooth.png", data_name="BaseDetailSepration")) Nb_32F, A_8U = loadNormal( self.characterResultFile("N_b_smooth.png", data_name="BaseDetailSepration")) W_32F = np.array(Nb_32F[:, :, 2]) W_32F = W_32F W_32F[W_32F < 0.95] = 0.0 L = lightEstimation(I_32F, N0_32F, A_8U) # L = lightEstimationByVoting(I_32F, N0_32F, A_8U) L_txt = 0.01 * np.int32(100 * L) L_img = lightSphere(L) fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(C0_8U, r'$C$') plot_grid.showImage(normalToColor(N0_32F, A_8U), r'$N$') plot_grid.showImage(setAlpha(C0_32F, W_32F), r'$Nd_z$') plot_grid.showImage( L_img, r'$L: [%s, %s, %s]$' % (L_txt[0], L_txt[1], L_txt[2])) showMaximize()
def centerImage(self): Labxy = np.float32(self._centers[self._labels]) Lab = Labxy[:, :, :3] print Lab.shape print Lab.dtype C_32F = Lab2rgb(Lab) C_32F = setAlpha(C_32F, self._A_32F) return C_32F
def sparseHistogramSampling(image, num_color_bin=24, num_xy_bins=64): h, w = image.shape[:2] Lab = LabFeatures(image) xy = positionFeatures(image) Labxy = np.concatenate((Lab, xy), axis=1) num_bins = [ num_color_bin, num_color_bin, num_color_bin, num_xy_bins, num_xy_bins ] num_color_bins = num_bins[:] num_color_bins.append(3) hist_bins = np.zeros(num_bins, dtype=np.float32) color_bins = np.zeros(num_color_bins, dtype=np.float32) f_min = np.min(Labxy, axis=0) f_max = np.max(Labxy, axis=0) num_bins = np.array(num_bins) f_ids = (num_bins - 1) * (Labxy - f_min) / (f_max - f_min) f_ids = np.int32(f_ids) hist_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]] += 1 color_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]] += Lab[:, :] hist_positive = hist_bins > 0.0 print np.count_nonzero(hist_positive) for ci in xrange(3): color_bins[hist_positive, ci] /= hist_bins[hist_positive] map_Lab = color_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]].reshape(h, w, -1) map_rgb = to8U(Lab2rgb(map_Lab)) print image.shape print map_rgb.shape map_image = setAlpha(map_rgb, alpha(image)) return map_image
def stylizedShadingFigure(): target_shapes = ["Man", "Ogre", "Grog", "Vase"] target_shapes = [shapeFile(shape_name) for shape_name in target_shapes] target_colormaps = [1, 5, 10, 3] target_colormaps = [colorMapFile(cmap_id) for cmap_id in target_colormaps] fig, axes = plt.subplots(figsize=(12, 4)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02, hspace=0.1, wspace=0.1) fig.suptitle("", fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) Ls = [] Ls.append(normalizeVector(np.array([-0.5, 0.3, 0.7]))) Ls.append(normalizeVector(np.array([0.2, -0.35, 0.4]))) Ls.append(normalizeVector(np.array([-0.2, 0.6, 0.3]))) Ls.append(normalizeVector(np.array([-0.2, 0.6, 0.3]))) for shape_file, colormap_file, L in zip(target_shapes, target_colormaps, Ls): N_32F, A_8U = loadNormal(shape_file) M_32F = loadColorMap(colormap_file) C_32F = ColorMapShader(M_32F).diffuseShading(L, N_32F) # C_32F = trim(C_32F, A_8U) # A_8U = trim(A_8U, A_8U) C_32F = setAlpha(C_32F, to32F(A_8U)) # h, w = C_32F.shape[:2] # # h_t = 512 # w_t = w * h_t / h # C_32F = cv2.resize(C_32F, (w_t, h_t)) plot_grid.showImage(C_32F, "", alpha_clip=True) file_path = os.path.join(shapeResultsDir(), "StylizedShading.png") fig.savefig(file_path, transparent=True)
def _runImp(self): normal_data = loadNormal(self._data_file) if normal_data is None: return N0_32F, A_8U = normal_data A_32F = to32F(A_8U) L = normalizeVector(np.array([-0.2, 0.3, 0.7])) C0_32F = LambertShader().diffuseShading(L, N0_32F) self._normal_constraint.clear() if os.path.exists(self.constraintFile()): self._normal_constraint.load(self.constraintFile()) self._tool.setImage(setAlpha(C0_32F, A_32F))
def _runLayer(self, layer_file): C0_8U = loadRGBA(layer_file) if C0_8U is None: return A_8U = alpha(C0_8U) if A_8U is None: return C0_32F = to32F(rgb(C0_8U)) I_32F = luminance(C0_32F) N0_32F, A_8U = loadNormal(self.characterResultFile("N0_d.png", data_name="BaseDetailSepration")) Nd_32F, A_8U = loadNormal(self.characterResultFile("N_d_smooth.png", data_name="BaseDetailSepration")) Nb_32F, A_8U = loadNormal(self.characterResultFile("N_b_smooth.png", data_name="BaseDetailSepration")) W_32F = np.array(Nb_32F[:, :, 2]) W_32F = W_32F W_32F[W_32F < 0.95] = 0.0 L = lightEstimation(I_32F, N0_32F, A_8U) # L = lightEstimationByVoting(I_32F, N0_32F, A_8U) L_txt = 0.01 * np.int32(100 * L) L_img = lightSphere(L) fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(C0_8U, r'$C$') plot_grid.showImage(normalToColor(N0_32F, A_8U), r'$N$') plot_grid.showImage(setAlpha(C0_32F, W_32F), r'$Nd_z$') plot_grid.showImage(L_img, r'$L: [%s, %s, %s]$' %(L_txt[0], L_txt[1], L_txt[2])) showMaximize()
def sparseHistogramSampling(image, num_color_bin=24, num_xy_bins=64): h, w = image.shape[:2] Lab = LabFeatures(image) xy = positionFeatures(image) Labxy = np.concatenate((Lab, xy), axis=1) num_bins = [num_color_bin, num_color_bin, num_color_bin, num_xy_bins, num_xy_bins] num_color_bins = num_bins[:] num_color_bins.append(3) hist_bins = np.zeros(num_bins, dtype=np.float32) color_bins = np.zeros(num_color_bins, dtype=np.float32) f_min = np.min(Labxy, axis=0) f_max = np.max(Labxy, axis=0) num_bins = np.array(num_bins) f_ids = (num_bins - 1) * (Labxy - f_min) / (f_max - f_min) f_ids = np.int32(f_ids) hist_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]] += 1 color_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]] += Lab[:, :] hist_positive = hist_bins > 0.0 print np.count_nonzero(hist_positive) for ci in xrange(3): color_bins[hist_positive, ci] /= hist_bins[hist_positive] map_Lab = color_bins[f_ids[:, 0], f_ids[:, 1], f_ids[:, 2], f_ids[:, 3], f_ids[:, 4]].reshape(h, w, -1) map_rgb = to8U(Lab2rgb(map_Lab)) print image.shape print map_rgb.shape map_image = setAlpha(map_rgb, alpha(image)) return map_image
def _runColorMap(self, colormap_file, Ng_32F, N0_32F, A_8U): M_32F = loadColorMap(colormap_file) L0 = normalizeVector(np.array([-0.2, 0.3, 0.6])) L0_img = lightSphere(L0) L0_txt = 0.01 * np.int32(100 * L0) C0_32F = ColorMapShader(M_32F).diffuseShading(L0, Ng_32F) I_32F = luminance(C0_32F) L = lightEstimation(I_32F, N0_32F, A_8U) L_txt = 0.01 * np.int32(100 * L) L_img = lightSphere(L) fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.05, right=0.95, top=0.9, hspace=0.12, wspace=0.05) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(setAlpha(C0_32F, A_8U), r'Input image: $\mathbf{c}$', font_size=font_size) plot_grid.showImage(normalToColor(N0_32F, A_8U), r'Initial normal: $\mathbf{N}_0$') plot_grid.showImage( L0_img, r'Ground trugh light: $L_g = (%s, %s, %s)$' % (L0_txt[0], L0_txt[1], L0_txt[2])) plot_grid.showImage( L_img, r'Estimated light: $L = (%s, %s, %s)$' % (L_txt[0], L_txt[1], L_txt[2])) showMaximize()
def _runImp(self): normal_data = loadNormal(self._data_file) if normal_data is None: return N0_32F, A_8U = normal_data A_32F = to32F(A_8U) L = normalizeVector(np.array([-0.2, 0.3, 0.7])) #C0_32F = ToonShader().diffuseShading(L, N0_32F) C0_32F = LambertShader().diffuseShading(L, N0_32F) I0_32F = luminance(C0_32F) I0_low_32F = cv2.resize(I0_32F, (256, 256)) A_low_8U = cv2.resize(A_8U, I0_low_32F.shape) D_32F = depthFromGradient(I0_low_32F, A_low_8U) D_32F = cv2.resize(D_32F, I0_32F.shape) N_32F = depthToNormal(D_32F) self._view.setRGBAD(setAlpha(C0_32F, A_32F), D_32F)
def slicSampling(image, num_segments=4000, sigma=5): h, w = image.shape[:2] C_32F = to32F(rgb(image)) segments = slic(C_32F, n_segments=num_segments, sigma=sigma) print segments.shape print np.max(segments) num_centers = np.max(segments) + 1 hist_centers = np.zeros((num_centers), dtype=np.float32) centers = np.zeros((num_centers, 3), dtype=np.float32) hist_centers[segments[:, :]] += 1.0 centers[segments[:, :], :] += C_32F[:, :, :3] hist_positive = hist_centers > 0.0 print np.count_nonzero(hist_positive) for ci in xrange(3): centers[hist_positive, ci] /= hist_centers[hist_positive] map_rgb = to8U(centers[segments[:, :], :].reshape(h, w, -1)) #map_rgb = to8U(mark_boundaries(C_32F, segments)) map_image = setAlpha(map_rgb, alpha(image)) return map_image
def slicSampling(image, num_segments=4000, sigma=5): h, w = image.shape[:2] C_32F = to32F(rgb(image)) segments = slic(C_32F, n_segments=num_segments, sigma=sigma) print segments.shape print np.max(segments) num_centers = np.max(segments) + 1 hist_centers = np.zeros((num_centers), dtype=np.float32) centers = np.zeros((num_centers, 3), dtype=np.float32) hist_centers[segments[:, :]] += 1.0 centers[segments[:, :], :] += C_32F[:, :, :3] hist_positive = hist_centers > 0.0 print np.count_nonzero(hist_positive) for ci in xrange(3): centers[hist_positive, ci] /= hist_centers[hist_positive] map_rgb = to8U(centers[segments[:, :], :].reshape(h, w, -1)) # map_rgb = to8U(mark_boundaries(C_32F, segments)) map_image = setAlpha(map_rgb, alpha(image)) return map_image
def relightingFigure(shape_name="Vase", cmap_id=3): num_methods = 3 num_lights = 2 num_rows = num_lights + 1 num_cols = num_methods + 2 w = 15 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) Lg = normalizeVector(np.array([-0.2, 0.3, 0.5])) Lg_img = lightSphere(Lg) L1 = normalizeVector(np.array([0.0, 0.7, 0.6])) L2 = normalizeVector(np.array([0.3, 0.5, 0.6])) # Ls = [normalizeVector(Lg * (1.0 - t) + t * L1) for t in np.linspace(0.0, 1.0, num_lights) ] Ls = [L1, L2] Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data A_8U = cv2.bilateralFilter(A_8U, 0, 5, 2) colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(Lg, Ng_32F) toon_sfs = ToonSFS(Lg, C0_32F, A_8U) toon_sfs.setInitialNormal(N0_32F) toon_sfs.setNumIterations(iterations=50) toon_sfs.setWeights(w_lap=0.2) toon_sfs.run() N_toon = toon_sfs.normal() C_toon = toon_sfs.shading() C_lumo, N_lumo = lumoSFS(C0_32F, Lg, N0_32F, A_8U) C_wu, N_wu = wuSFS(C0_32F, Lg, N0_32F, A_8U) M_lumo = estimatedReflectance(C0_32F, Lg, N_lumo, A_8U) M_wu = estimatedReflectance(C0_32F, Lg, N_wu, A_8U) plot_grid.showImage(Lg_img, "Light direction") plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C_lumo, to32F(A_8U)), "Lumo") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_wu, to32F(A_8U)), "Lambert assumption") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_toon, to32F(A_8U)), "Our result") #plot_grid.showColorMap(C_error_toon, title, v_min=0, v_max=0.1, with_colorbar=True) for L in Ls: C1 = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) C1_lumo = M_lumo.shading(LdotN(L, N_lumo).flatten()).reshape(C0_32F.shape) C1_wu = M_wu.shading(LdotN(L, N_wu).flatten()).reshape(C0_32F.shape) C1_toon = toon_sfs.relighting(L) plot_grid.showImage(lightSphere(L), "") plot_grid.showImage(setAlpha(C1, to32F(A_8U)), "") title = "" plot_grid.showImage(setAlpha(C1_lumo, to32F(A_8U)), "") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_wu, to32F(A_8U)), "") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_toon, to32F(A_8U)), "") # showMaximize() file_path = shapeResultFile("Relighting", "RelightingComparison", file_ext=".png") fig.savefig(file_path, transparent=True)
def methodComparisonFigure(shape_name="ThreeBox", cmap_id=10): num_methods = 3 num_rows = 3 num_cols = 2 * num_methods + 1 w = 20 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.4, 0.5, 0.6])) Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data A_8U = cv2.bilateralFilter(A_8U, 0, 5, 2) colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) toon_sfs = ToonSFS(L, C0_32F, A_8U) toon_sfs.setInitialNormal(N0_32F) toon_sfs.setNumIterations(iterations=100) toon_sfs.setWeights(w_lap=0.1) toon_sfs.run() N_toon = toon_sfs.normal() C_toon = toon_sfs.shading() C_lumo, N_lumo = lumoSFS(C0_32F, L, N0_32F, A_8U) C_wu, N_wu = wuSFS(C0_32F, L, N0_32F, A_8U) C_error_toon, N_error_toon, I_error_toon = computeErrors( L, C0_32F, C_toon, Ng_32F, N_toon, A_8U) C_error_lumo, N_error_lumo, I_error_lumo = computeErrors( L, C0_32F, C_lumo, Ng_32F, N_lumo, A_8U) C_error_wu, N_error_wu, I_error_wu = computeErrors(L, C0_32F, C_wu, Ng_32F, N_wu, A_8U) plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C_lumo, to32F(A_8U)), "Lumo") plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_wu, to32F(A_8U)), "Lambert assumption") plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_toon, to32F(A_8U)), "Our result") plot_grid.showColorMap(C_error_toon, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) plot_grid.showImage(normalToColor(N_lumo, A_8U), title) plot_grid.showColorMap(N_error_lumo, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(normalToColor(N_wu, A_8U), title) plot_grid.showColorMap(N_error_wu, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(normalToColor(N_toon, A_8U), title) plot_grid.showColorMap(N_error_toon, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(computeIllumination(L, Ng_32F, A_8U), title) plot_grid.showImage(computeIllumination(L, N_lumo, A_8U), title) plot_grid.showColorMap(I_error_lumo, title, v_min=0, v_max=0.2, with_colorbar=True) plot_grid.showImage(computeIllumination(L, N_wu, A_8U), title) plot_grid.showColorMap(I_error_wu, title, v_min=0, v_max=0.2, with_colorbar=True) plot_grid.showImage(computeIllumination(L, N_toon, A_8U), title) plot_grid.showColorMap(I_error_toon, title, v_min=0, v_max=0.2, with_colorbar=True) # showMaximize() file_path = shapeResultFile("ShapeEstimation", "Comparison_%s_%s" % (shape_name, cmap_id), file_ext=".png") fig.savefig(file_path, transparent=True)
def relightingVideo(shape_name="Ogre", cmap_id=3): num_methods = 3 num_rows = 1 num_cols = num_methods + 2 num_lights = 120 w = 10 h = 5 fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("Shading Analysis", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) Lg = normalizeVector(np.array([-0.2, 0.3, 0.5])) Lg_img = lightSphere(Lg) L1 = normalizeVector(np.array([0.5, 0.5, 0.6])) Ls = [ normalizeVector(Lg * (1.0 - t) + t * L1) for t in np.linspace(0.0, 1.0, num_lights) ] # Ls = [normalizeVector(Lg + 1.0 * np.cos(t) * np.array([1, 0, 0]) + 1.0 * np.sin(t) * np.array([0, 1, 0])) for t in np.linspace(0.0, 1.0, num_lights) ] Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data A_8U = cv2.bilateralFilter(A_8U, 0, 5, 2) colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(Lg, Ng_32F) toon_sfs = ToonSFS(Lg, C0_32F, A_8U) toon_sfs.setInitialNormal(N0_32F) toon_sfs.setNumIterations(iterations=100) toon_sfs.setWeights(w_lap=0.2) toon_sfs.run() N_toon = toon_sfs.normal() C_toon = toon_sfs.shading() C_lumo, N_lumo = lumoSFS(C0_32F, Lg, N0_32F, A_8U) C_wu, N_wu = wuSFS(C0_32F, Lg, N0_32F, A_8U) M_lumo = estimatedReflectance(C0_32F, Lg, N_lumo, A_8U) M_wu = estimatedReflectance(C0_32F, Lg, N_wu, A_8U) plot_grid.showImage(Lg_img, "Light direction") plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C_lumo, to32F(A_8U)), "Lumo") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_wu, to32F(A_8U)), "Lambert assumption") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_toon, to32F(A_8U)), "Our result") #plot_grid.showColorMap(C_error_toon, title, v_min=0, v_max=0.1, with_colorbar=True) images = [] for i in xrange(48): images.append(figure2numpy(fig)) for li, L in enumerate(Ls): print li fig.clear() fig.suptitle("Relighting", fontsize=font_size) plot_grid.setPlot(1, 1) C1 = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) C1_lumo = M_lumo.shading(LdotN(L, N_lumo).flatten()).reshape(C0_32F.shape) C1_wu = M_wu.shading(LdotN(L, N_wu).flatten()).reshape(C0_32F.shape) C1_toon = toon_sfs.relighting(L) plot_grid.showImage(lightSphere(L), "Light direction") plot_grid.showImage(setAlpha(C1, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C1_lumo, to32F(A_8U)), "Lumo") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_wu, to32F(A_8U)), "Lambert assumption") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_toon, to32F(A_8U)), "Our result") images.append(figure2numpy(fig)) file_path = shapeResultFile("Relighting", "Relighting_%s_%s" % (shape_name, cmap_id), file_ext=".wmv") saveVideo(file_path, images)
def computeIllumination(L, N_32F, A_8U): I_32F = np.clip(LdotN(L, N_32F), 0.0, 1.0) I_32F[A_8U < 0.5 * np.max(A_8U)] = 0.0 I_32F = setAlpha(gray2rgb(to8U(I_32F)), A_8U) I_32F = trim(I_32F, A_8U) return I_32F
def materialShapeVariationFigure(): target_colormaps = [23, 3, 12] #target_colormaps = [3, 17] colormap_files = [colorMapFile(cmap_id) for cmap_id in target_colormaps] target_shapes = ["Blob1", "ThreeBox"] shape_names = target_shapes #shape_names = shapeNames()[4:5] num_shapes = len(shape_names) num_colormaps = len(colormap_files) num_rows = num_colormaps num_cols = 6 w = 20 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.02, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.4, 0.5, 0.6])) shape_name = "Blob1" Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data for mi, colormap_file in enumerate(colormap_files): M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) sfs_method = ToonSFS(L, C0_32F, A_8U) sfs_method.setInitialNormal(N0_32F) sfs_method.setNumIterations(iterations=40) sfs_method.setWeights(w_lap=5.0) sfs_method.run() N_32F = sfs_method.normal() C_32F = sfs_method.shading() #C_32F = cv2.bilateralFilter(C_32F, 0, 0.1, 3) C_error = sfs_method.shadingError() C_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 C_error = trim(C_error, A_8U) h, w = A_8U.shape N_error = angleErros(N_32F.reshape(-1, 3), Ng_32F.reshape(-1, 3)).reshape(h, w) N_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 N_error = trim(N_error, A_8U) title = "" if mi == 0: title = "Ground-truth" plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), title) title = "" if mi == 0: title = "Our result" plot_grid.showImage(setAlpha(C_32F, to32F(A_8U)), title) title = "" if mi == 0: title = "Error (shading)" plot_grid.showColorMap(C_error, title, v_min=0, v_max=0.1, with_colorbar=True) title = "" if mi == 0: title = "Ground-truth" plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) title = "" if mi == 0: title = "Our result" plot_grid.showImage(normalToColor(N_32F, A_8U), title) title = "" if mi == 0: title = "Error (shape)" plot_grid.showColorMap(N_error, title, v_min=0, v_max=50.0, with_colorbar=True) #showMaximize() file_path = shapeResultFile("ShapeEstimation", "MaterialShapeEvaluation", file_ext=".pdf") fig.savefig(file_path, transparent=False)
def LambertShadingFigure(): target_shapes = [ "Sphere", "Cone", "Blob1", "Man", "Cone", "OctaFlower", "Pulley", "Grog", "Lucy", "Raptor" ] target_shapes = ["Blob1", "Pulley", "Lucy"] shape_names = target_shapes num_rows = len(shape_names) num_cols = 6 w = 20 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.02, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.2, 0.3, 0.6])) for si, shape_name in enumerate(shape_names): Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data C0_32F = LambertShader().diffuseShading(L, Ng_32F) sfs_method = ToonSFS(L, C0_32F, A_8U) sfs_method.setInitialNormal(N0_32F) sfs_method.setNumIterations(iterations=70) sfs_method.setWeights(w_lap=1.0) sfs_method.run() N_32F = sfs_method.normal() C_32F = sfs_method.shading() C_error = sfs_method.shadingError() C_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 C_error = trim(C_error, A_8U) h, w = A_8U.shape N_error = angleErros(N_32F.reshape(-1, 3), Ng_32F.reshape(-1, 3)).reshape(h, w) N_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 N_error = trim(N_error, A_8U) title = "" if si == 0: title = "Ground-truth" plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), title) title = "" if si == 0: title = "Our result" plot_grid.showImage(setAlpha(C_32F, to32F(A_8U)), title) title = "" if si == 0: title = "Error (shading)" plot_grid.showColorMap(C_error, title, v_min=0, v_max=0.1, with_colorbar=True) title = "" if si == 0: title = "Ground-truth" plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) title = "" if si == 0: title = "Our result" plot_grid.showImage(normalToColor(N_32F, A_8U), title) title = "" if si == 0: title = "Error (shape)" plot_grid.showColorMap(N_error, title, v_min=0, v_max=30.0, with_colorbar=True) file_path = shapeResultFile("ShapeEstimation", "LambertEstimationError", file_ext=".pdf") fig.savefig(file_path, transparent=True)
def LambertShadingFigure(): target_shapes = ["Sphere", "Cone", "Blob1", "Man", "Cone", "OctaFlower", "Pulley", "Grog", "Lucy", "Raptor"] target_shapes = ["Blob1", "Pulley", "Lucy"] shape_names = target_shapes num_rows = len(shape_names) num_cols = 6 w = 20 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.02, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.2, 0.3, 0.6])) for si, shape_name in enumerate(shape_names): Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data C0_32F = LambertShader().diffuseShading(L, Ng_32F) sfs_method = ToonSFS(L, C0_32F, A_8U) sfs_method.setInitialNormal(N0_32F) sfs_method.setNumIterations(iterations=70) sfs_method.setWeights(w_lap=1.0) sfs_method.run() N_32F = sfs_method.normal() C_32F = sfs_method.shading() C_error = sfs_method.shadingError() C_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 C_error = trim(C_error, A_8U) h, w = A_8U.shape N_error = angleErros(N_32F.reshape(-1, 3), Ng_32F.reshape(-1, 3)).reshape(h, w) N_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 N_error = trim(N_error, A_8U) title = "" if si == 0: title = "Ground-truth" plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), title) title = "" if si == 0: title = "Our result" plot_grid.showImage(setAlpha(C_32F, to32F(A_8U)), title) title = "" if si == 0: title = "Error (shading)" plot_grid.showColorMap(C_error, title, v_min=0, v_max=0.1, with_colorbar=True) title = "" if si == 0: title = "Ground-truth" plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) title = "" if si == 0: title = "Our result" plot_grid.showImage(normalToColor(N_32F, A_8U), title) title = "" if si == 0: title = "Error (shape)" plot_grid.showColorMap(N_error, title, v_min=0, v_max=30.0, with_colorbar=True) file_path = shapeResultFile("ShapeEstimation", "LambertEstimationError", file_ext=".pdf") fig.savefig(file_path, transparent=True)
def _runLayer(self, layer_file): C0_8U = loadRGBA(layer_file) if C0_8U is None: return A_8U = alpha(C0_8U) if A_8U is None: return A_32F = to32F(A_8U) C0_32F = to32F(rgb(C0_8U)) I0_32F = luminance(C0_32F) initial_normals = ["N_lumo.png", "N0_d.png"] layer_name = os.path.splitext(os.path.basename(layer_file))[0] for initial_normal in initial_normals: N0_32F, AN_8U = loadNormal( self.characterResultFile(initial_normal, data_name="BaseDetailSepration")) N_32F, L, C_32F, M = self._runSFS(C0_32F, A_8U, N0_32F, AN_8U) L_img = lightSphere(L) M_img = M.mapImage() fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.9, hspace=0.12, wspace=0.02) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(normalToColor(N0_32F, A_8U), r'Initial Normal: $N_0$') plot_grid.showImage(normalToColor(N_32F, A_8U), r'Estimated Normal: $N$') plot_grid.showImage(C0_8U, r'Shading: $C_0$') plot_grid.showImage(setAlpha(C_32F, A_32F), r'Recovered Shading: $C$') out_file_path = self.characterResultFile("ToonSFS" + initial_normal, layer_name=layer_name) plt.savefig(out_file_path) N_trim = trim(N_32F, A_8U) N0_trim = trim(N0_32F, A_8U) C0_trim = trim(C0_32F, A_8U) A_trim = trim(A_8U, A_8U) out_file_path = self.characterResultFile(initial_normal, layer_name=layer_name) saveNormal(out_file_path, N_trim, A_trim) images = self._relightingImages(N_trim, A_trim, M) initial_normal_name = os.path.splitext(initial_normal)[0] video_name = "Relighting" + initial_normal_name + ".wmv" out_file_path = self.characterResultFile(video_name, layer_name=layer_name) saveVideo(out_file_path, images) images = self._relightingOffsetImages(L, C0_trim, N0_trim, A_trim, M) video_name = "RelightingOffset" + initial_normal_name + ".wmv" out_file_path = self.characterResultFile(video_name, layer_name=layer_name) saveVideo(out_file_path, images)
def methodComparisonFigure(shape_name="ThreeBox", cmap_id=10): num_methods = 3 num_rows = 3 num_cols = 2 * num_methods + 1 w = 20 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.4, 0.5, 0.6])) Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data A_8U = cv2.bilateralFilter(A_8U, 0, 5, 2) colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) toon_sfs = ToonSFS(L, C0_32F, A_8U) toon_sfs.setInitialNormal(N0_32F) toon_sfs.setNumIterations(iterations=100) toon_sfs.setWeights(w_lap=0.1) toon_sfs.run() N_toon = toon_sfs.normal() C_toon = toon_sfs.shading() C_lumo, N_lumo = lumoSFS(C0_32F, L, N0_32F, A_8U) C_wu, N_wu = wuSFS(C0_32F, L, N0_32F, A_8U) C_error_toon, N_error_toon, I_error_toon = computeErrors(L, C0_32F, C_toon, Ng_32F, N_toon, A_8U) C_error_lumo, N_error_lumo, I_error_lumo = computeErrors(L, C0_32F, C_lumo, Ng_32F, N_lumo, A_8U) C_error_wu, N_error_wu, I_error_wu = computeErrors(L, C0_32F, C_wu, Ng_32F, N_wu, A_8U) plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C_lumo, to32F(A_8U)), "Lumo") plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_wu, to32F(A_8U)), "Lambert assumption") plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_toon, to32F(A_8U)), "Our result") plot_grid.showColorMap(C_error_toon, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) plot_grid.showImage(normalToColor(N_lumo, A_8U), title) plot_grid.showColorMap(N_error_lumo, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(normalToColor(N_wu, A_8U), title) plot_grid.showColorMap(N_error_wu, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(normalToColor(N_toon, A_8U), title) plot_grid.showColorMap(N_error_toon, title, v_min=0, v_max=50.0, with_colorbar=True) plot_grid.showImage(computeIllumination(L, Ng_32F, A_8U), title) plot_grid.showImage(computeIllumination(L, N_lumo, A_8U), title) plot_grid.showColorMap(I_error_lumo, title, v_min=0, v_max=0.2, with_colorbar=True) plot_grid.showImage(computeIllumination(L, N_wu, A_8U), title) plot_grid.showColorMap(I_error_wu, title, v_min=0, v_max=0.2, with_colorbar=True) plot_grid.showImage(computeIllumination(L, N_toon, A_8U), title) plot_grid.showColorMap(I_error_toon, title, v_min=0, v_max=0.2, with_colorbar=True) # showMaximize() file_path = shapeResultFile("ShapeEstimation", "Comparison_%s_%s" %(shape_name, cmap_id), file_ext=".png") fig.savefig(file_path, transparent=True)
def overviewFigure(): cmap_id = 10 colormap_file = colorMapFile(cmap_id) num_rows = 1 num_cols = 5 w = 10 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.02, hspace=0.05, wspace=0.05) fig.suptitle("", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) L = normalizeVector(np.array([-0.4, 0.6, 0.6])) L_img = lightSphere(L) shape_name = "ThreeBox" Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data M_32F = loadColorMap(colormap_file) Cg_32F = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) borders=[0.6, 0.8, 0.92] colors = [np.array([0.2, 0.2, 0.4]), np.array([0.3, 0.3, 0.6]), np.array([0.4, 0.4, 0.8]), np.array([0.5, 0.5, 1.0])] #Cg_32F = ToonShader(borders, colors).diffuseShading(L, Ng_32F) #Cg_32F = cv2.GaussianBlur(Cg_32F, (0,0), 2.0) sfs_method = ToonSFS(L, Cg_32F, A_8U) sfs_method.setInitialNormal(N0_32F) sfs_method.setNumIterations(iterations=40) sfs_method.setWeights(w_lap=10.0) sfs_method.run() N_32F = sfs_method.normal() I_32F = np.float32(np.clip(LdotN(L, N_32F), 0.0, 1.0)) I0_32F = np.float32(np.clip(LdotN(L, N0_32F), 0.0, 1.0)) C_32F = sfs_method.shading() C0_32F = sfs_method.initialShading() M_32F = sfs_method.colorMap().mapImage() L1 = normalizeVector(np.array([0.0, 0.6, 0.6])) L1_img = lightSphere(L1) C1_32F = sfs_method.relighting(L1) L2 = normalizeVector(np.array([0.5, 0.8, 0.6])) L2_img = lightSphere(L2) C2_32F = sfs_method.relighting(L2) N_sil = silhouetteNormal(A_8U, sigma=7.0) N_sil[:, :, 2] = N_sil[:, :, 2] ** 10.0 N_sil = normalizeImage(N_sil) A_sil = 1.0 - N_sil[:, :, 2] A_sil = to8U(A_sil) N_xy = N_sil[:, :, 0] ** 2 + N_sil[:, :, 1] ** 2 A_sil[N_xy < 0.1] = 0 title = "" plot_grid.showImage(setAlpha(Cg_32F, to32F(A_8U)), title) plot_grid.showImage(normalToColor(N0_32F, A_8U), title) plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), title) plot_grid.showImage(normalToColor(N_32F, A_8U), title) plot_grid.showImage(setAlpha(C_32F, to32F(A_8U)), title) # plot_grid.showImage(normalToColor(Ng_32F, A_8U), title) #showMaximize() file_path = shapeResultFile("Overview", "Overview") fig.savefig(file_path, transparent=True) file_path = shapeResultFile("Overview", "Cg") saveRGBA(file_path, setAlpha(Cg_32F, to32F(A_8U))) file_path = shapeResultFile("Overview", "L") saveRGB(file_path, gray2rgb(to8U(L_img))) file_path = shapeResultFile("Overview", "L1") saveRGB(file_path, gray2rgb(to8U(L1_img))) file_path = shapeResultFile("Overview", "L2") saveRGB(file_path, gray2rgb(to8U(L2_img))) file_path = shapeResultFile("Overview", "N0") saveNormal(file_path, N0_32F, A_8U) file_path = shapeResultFile("Overview", "N_sil") saveNormal(file_path, N_sil, A_sil) file_path = shapeResultFile("Overview", "N") saveNormal(file_path, N_32F, A_8U) file_path = shapeResultFile("Overview", "C0") saveRGBA(file_path, setAlpha(C0_32F, to32F(A_8U))) file_path = shapeResultFile("Overview", "C") saveRGBA(file_path, setAlpha(C_32F, to32F(A_8U))) file_path = shapeResultFile("Overview", "C1") saveRGBA(file_path, setAlpha(C1_32F, to32F(A_8U))) file_path = shapeResultFile("Overview", "C2") saveRGBA(file_path, setAlpha(C2_32F, to32F(A_8U))) file_path = shapeResultFile("Overview", "I") saveRGBA(file_path, setAlpha(gray2rgb(I_32F), to32F(A_8U))) file_path = shapeResultFile("Overview", "I0") saveRGBA(file_path, setAlpha(gray2rgb(I0_32F), to32F(A_8U))) file_path = shapeResultFile("Overview", "M") saveRGB(file_path, M_32F)
def relightingVideo(shape_name="Ogre", cmap_id=3): num_methods = 3 num_rows = 1 num_cols = num_methods + 2 num_lights = 120 w = 10 h = 5 fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.96, bottom=0.04, hspace=0.15, wspace=0.1) fig.suptitle("Shading Analysis", fontsize=font_size) plot_grid = SubplotGrid(num_rows, num_cols) Lg = normalizeVector(np.array([-0.2, 0.3, 0.5])) Lg_img = lightSphere(Lg) L1 = normalizeVector(np.array([0.5, 0.5, 0.6])) Ls = [normalizeVector(Lg * (1.0 - t) + t * L1) for t in np.linspace(0.0, 1.0, num_lights) ] # Ls = [normalizeVector(Lg + 1.0 * np.cos(t) * np.array([1, 0, 0]) + 1.0 * np.sin(t) * np.array([0, 1, 0])) for t in np.linspace(0.0, 1.0, num_lights) ] Ng_data = shapeFile(shape_name) Ng_data = loadNormal(Ng_data) Ng_32F, A_8U = Ng_data N0_file = shapeResultFile(result_name="InitialNormal", data_name=shape_name) N0_data = loadNormal(N0_file) N0_32F, A_8U = N0_data A_8U = cv2.bilateralFilter(A_8U, 0, 5, 2) colormap_file = colorMapFile(cmap_id) M_32F = loadColorMap(colormap_file) C0_32F = ColorMapShader(M_32F).diffuseShading(Lg, Ng_32F) toon_sfs = ToonSFS(Lg, C0_32F, A_8U) toon_sfs.setInitialNormal(N0_32F) toon_sfs.setNumIterations(iterations=100) toon_sfs.setWeights(w_lap=0.2) toon_sfs.run() N_toon = toon_sfs.normal() C_toon = toon_sfs.shading() C_lumo, N_lumo = lumoSFS(C0_32F, Lg, N0_32F, A_8U) C_wu, N_wu = wuSFS(C0_32F, Lg, N0_32F, A_8U) M_lumo = estimatedReflectance(C0_32F, Lg, N_lumo, A_8U) M_wu = estimatedReflectance(C0_32F, Lg, N_wu, A_8U) plot_grid.showImage(Lg_img, "Light direction") plot_grid.showImage(setAlpha(C0_32F, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C_lumo, to32F(A_8U)), "Lumo") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_wu, to32F(A_8U)), "Lambert assumption") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C_toon, to32F(A_8U)), "Our result") #plot_grid.showColorMap(C_error_toon, title, v_min=0, v_max=0.1, with_colorbar=True) images = [] for i in xrange(48): images.append(figure2numpy(fig)) for li, L in enumerate(Ls): print li fig.clear() fig.suptitle("Relighting", fontsize=font_size) plot_grid.setPlot(1, 1) C1 = ColorMapShader(M_32F).diffuseShading(L, Ng_32F) C1_lumo = M_lumo.shading(LdotN(L, N_lumo).flatten()).reshape(C0_32F.shape) C1_wu = M_wu.shading(LdotN(L, N_wu).flatten()).reshape(C0_32F.shape) C1_toon = toon_sfs.relighting(L) plot_grid.showImage(lightSphere(L), "Light direction") plot_grid.showImage(setAlpha(C1, to32F(A_8U)), "Ground-truth") title = "" plot_grid.showImage(setAlpha(C1_lumo, to32F(A_8U)), "Lumo") #plot_grid.showColorMap(C_error_lumo, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_wu, to32F(A_8U)), "Lambert assumption") #plot_grid.showColorMap(C_error_wu, title, v_min=0, v_max=0.1, with_colorbar=True) plot_grid.showImage(setAlpha(C1_toon, to32F(A_8U)), "Our result") images.append(figure2numpy(fig)) file_path = shapeResultFile("Relighting", "Relighting_%s_%s" %(shape_name, cmap_id), file_ext=".wmv") saveVideo(file_path, images)
def reflectanceEstimationFigure(): errorTable() M_errors = loadReflectanceErrorTable() M_error_orders = np.argsort(M_errors) print M_errors[M_error_orders] colormap_files = colorMapFiles() colormap_files = [colormap_files[M_error_order] for M_error_order in M_error_orders] colormap_files = colormap_files[0:-1:3] Ms = [] MLs = [] for colormap_file in colormap_files: M_32F = loadColorMap(colormap_file) Ms.append(M_32F) C_32F = M_32F.reshape(1, len(M_32F), 3) I_32F = np.linspace(0.0, 1.0, len(M_32F)) I_32F = I_32F.reshape(C_32F.shape[:2]) reflectance = LambertReflectanceEstimation(C_32F, I_32F) Ml = reflectance.shading(I_32F) MLs.append(Ml[0, :, :]) num_rows = 3 num_cols = len(colormap_files) w = 10 h = w * num_rows / num_cols fig, axes = plt.subplots(figsize=(w, h)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02, hspace=0.05, wspace=0.05) fig.suptitle("", fontsize=font_size) N_sphere, A_32F = normalSphere(h=512, w=512) Lg = normalizeVector(np.array([-0.2, 0.3, 0.6])) plot_grid = SubplotGrid(num_rows, num_cols) mi = 1 for M, Ml in zip(Ms, MLs): CM_32F = ColorMapShader(M).diffuseShading(Lg, N_sphere) CL_32F = ColorMapShader(Ml).diffuseShading(Lg, N_sphere) C_error = normVectors((CM_32F - CL_32F).reshape(-1, 3)).reshape(CL_32F.shape[:2]) C_error[A_32F < 0.5 * np.max(A_32F)] = 0.0 plot_grid.setPlot(1, mi) plot_grid.showImage(setAlpha(CM_32F, A_32F), "") plot_grid.setPlot(2, mi) plot_grid.showImage(setAlpha(CL_32F, A_32F), "") plot_grid.setPlot(3, mi) plot_grid.showColorMap(C_error, "", v_min=0.0, v_max=0.3, with_colorbar=False) mi += 1 file_path = shapeResultFile("ReflectanceEstimation", "ReflectanceEstimationError") fig.savefig(file_path, transparent=True)
def _runLayer(self, layer_file): C0_8U = loadRGBA(layer_file) if C0_8U is None: return A_8U = alpha(C0_8U) if A_8U is None: return A_32F = to32F(A_8U) C0_32F = to32F(rgb(C0_8U)) I0_32F = luminance(C0_32F) initial_normals = ["N_lumo.png", "N0_d.png"] layer_name = os.path.splitext(os.path.basename(layer_file))[0] for initial_normal in initial_normals: N0_32F, AN_8U = loadNormal(self.characterResultFile(initial_normal, data_name="BaseDetailSepration")) N_32F, L, C_32F, M = self._runSFS(C0_32F, A_8U, N0_32F, AN_8U) L_img = lightSphere(L) M_img = M.mapImage() fig, axes = plt.subplots(figsize=(11, 5)) font_size = 15 fig.subplots_adjust(left=0.02, right=0.98, top=0.9, hspace=0.12, wspace=0.02) fig.suptitle(self.name(), fontsize=font_size) num_rows = 1 num_cols = 4 plot_grid = SubplotGrid(num_rows, num_cols) plot_grid.showImage(normalToColor(N0_32F, A_8U), r'Initial Normal: $N_0$') plot_grid.showImage(normalToColor(N_32F, A_8U), r'Estimated Normal: $N$') plot_grid.showImage(C0_8U, r'Shading: $C_0$') plot_grid.showImage(setAlpha(C_32F, A_32F), r'Recovered Shading: $C$') out_file_path = self.characterResultFile("ToonSFS" + initial_normal, layer_name=layer_name) plt.savefig(out_file_path) N_trim = trim(N_32F, A_8U) N0_trim = trim(N0_32F, A_8U) C0_trim = trim(C0_32F, A_8U) A_trim = trim(A_8U, A_8U) out_file_path = self.characterResultFile(initial_normal, layer_name=layer_name) saveNormal(out_file_path, N_trim, A_trim) images = self._relightingImages(N_trim, A_trim, M) initial_normal_name = os.path.splitext(initial_normal)[0] video_name = "Relighting" + initial_normal_name + ".wmv" out_file_path = self.characterResultFile(video_name, layer_name=layer_name) saveVideo(out_file_path, images) images = self._relightingOffsetImages(L, C0_trim, N0_trim, A_trim, M) video_name = "RelightingOffset" + initial_normal_name + ".wmv" out_file_path = self.characterResultFile(video_name, layer_name=layer_name) saveVideo(out_file_path, images)
def colorMapSphere(L, M_32F, h=512, w=512): N_32F, A_32F = normalSphere(h=h, w=w) C_32F = ColorMapShader(M_32F).diffuseShading(L, N_32F) C_32F = setAlpha(C_32F, A_32F) return C_32F