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 computeErrors(L, C0_32F, C_32F, Ng_32F, N_32F, 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) C_error = normVectors(C0_32F.reshape(-1, 3) - C_32F.reshape(-1, 3)).reshape(h, w) C_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 C_error = trim(C_error, A_8U) I_32F = np.clip(LdotN(L, N_32F), 0.0, 1.0) Ig_32F = np.clip(LdotN(L, Ng_32F), 0.0, 1.0) I_error = np.abs(I_32F - Ig_32F) I_error[A_8U < 0.5 * np.max(A_8U)] = 0.0 I_error = trim(I_error, A_8U) return C_error, N_error, I_error
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 showImage(self, image, title, alpha_clip=True, font_size=15): plt.subplot(self._num_rows, self._num_cols, self._plot_id) plt.title(title, fontsize=font_size) if len(image.shape) == 2: plt.gray() show_image = image if alpha_clip: if len(image.shape) == 3: if image.shape[2] == 4: show_image = trim(image, alpha(image)) plt.imshow(show_image) plt.axis('off') self._plot_id += 1
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 _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 _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 _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) N0_32F = trim(N0_32F, A_8U) A_32F = trim(A_32F, A_8U) A_8U = trim(A_8U, A_8U) L = normalizeVector(np.array([0.5, -0.2, 0.7])) C0_32F = ToonShader().diffuseShading(L, N0_32F) I0_32F = luminance(C0_32F) I_min, I_max = np.min(I0_32F), np.max(I0_32F) I_scale = (I0_32F - I_min) / (I_max - I_min) I_L = cv2.Laplacian(cv2.GaussianBlur(I_scale, (0, 0), 31.0), cv2.CV_32F, ksize=1) I_L_avg = np.average(np.abs(I_L)) Ix = cv2.Sobel(I0_32F, cv2.CV_64F, 1, 0, ksize=1) Ix = cv2.GaussianBlur(Ix, (0, 0), 3.0) Ixx = cv2.Sobel(Ix, cv2.CV_64F, 1, 0, ksize=1) Ixx = cv2.GaussianBlur(Ixx, (0, 0), 5.0) Iy = -cv2.Sobel(I0_32F, cv2.CV_64F, 0, 1, ksize=1) Iy = cv2.GaussianBlur(Iy, (0, 0), 3.0) Iyy = -cv2.Sobel(Iy, cv2.CV_64F, 0, 1, ksize=1) Iyy = cv2.GaussianBlur(Iyy, (0, 0), 5.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 = 5 plot_grid = SubplotGrid(num_rows, num_cols) Nx = cv2.Sobel(N0_32F[:, :, 0], cv2.CV_64F, 1, 0, ksize=1) Nx = cv2.GaussianBlur(Nx, (0, 0), 3.0) Nxx = cv2.Sobel(Nx, cv2.CV_64F, 1, 0, ksize=1) Nxx = cv2.GaussianBlur(Nxx, (0, 0), 5.0) Ny = -cv2.Sobel(N0_32F[:, :, 1], cv2.CV_64F, 0, 1, ksize=1) Ny = cv2.GaussianBlur(Ny, (0, 0), 3.0) Nyy = -cv2.Sobel(Ny, cv2.CV_64F, 0, 1, ksize=1) Nyy = cv2.GaussianBlur(Nyy, (0, 0), 5.0) Nz_L = cv2.Laplacian(cv2.GaussianBlur(N0_32F[:, :, 2], (0, 0), 5.0), cv2.CV_32F, ksize=5) Nz_L_avg = np.average(np.abs(Nz_L)) Nz_L *= 1.0 / Nz_L_avg I_L *= 1.0 / I_L_avg print I_L_avg, Nz_L_avg Nz_L = np.clip(Nz_L, -5.0, 5.0) I_L = np.clip(I_L, -5.0, 5.0) plot_grid.showColorMap(N0_32F[:, :, 0], r'$N_{x}$', v_min=-0.01, v_max=0.01) plot_grid.showColorMap(N0_32F[:, :, 1], r'$N_{y}$', v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Nx, r'$N_{xx}$', v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Ny, r'$N_{yy}$', v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Nz_L, r'$Nz_L$') #plot_grid.showColorMap(Nx + Ny, r'$N_{xx} + N_{yy}$', v_min=-0.01, v_max=0.01) # Ixx[Ixx>0] = 1.0 # Ixx[Ixx<0] = -1.0 # Iyy[Iyy>0] = 1.0 # Iyy[Iyy<0] = -1.0 plot_grid.showColorMap(-Ix, r'$I_{x}$', v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Iy, r'$I_{y}$', v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Ixx, r'$I_{xx}$', v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Iyy, r'$I_{yy}$', v_min=-0.001, v_max=0.001) plot_grid.showColorMap(I_L, r'$I_L$') #plot_grid.showColorMap(-Ixx - Iyy, r'$I_{xx} + I_{yy}$', v_min=-0.01, v_max=0.01) #plot_grid.showColorMap(Iy, r'$I_{y}$') 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) N0_32F = trim(N0_32F, A_8U) A_32F = trim(A_32F, A_8U) A_8U = trim(A_8U, A_8U) L = normalizeVector(np.array([0.5, -0.2, 0.7])) C0_32F = ToonShader().diffuseShading(L, N0_32F) I0_32F = luminance(C0_32F) I_min, I_max = np.min(I0_32F), np.max(I0_32F) I_scale = (I0_32F - I_min) / (I_max - I_min) I_L = cv2.Laplacian(cv2.GaussianBlur(I_scale, (0, 0), 31.0), cv2.CV_32F, ksize=1) I_L_avg = np.average(np.abs(I_L)) Ix = cv2.Sobel(I0_32F, cv2.CV_64F, 1, 0, ksize=1) Ix = cv2.GaussianBlur(Ix, (0, 0), 3.0) Ixx = cv2.Sobel(Ix, cv2.CV_64F, 1, 0, ksize=1) Ixx = cv2.GaussianBlur(Ixx, (0, 0), 5.0) Iy = -cv2.Sobel(I0_32F, cv2.CV_64F, 0, 1, ksize=1) Iy = cv2.GaussianBlur(Iy, (0, 0), 3.0) Iyy = -cv2.Sobel(Iy, cv2.CV_64F, 0, 1, ksize=1) Iyy = cv2.GaussianBlur(Iyy, (0, 0), 5.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 = 5 plot_grid = SubplotGrid(num_rows, num_cols) Nx = cv2.Sobel(N0_32F[:, :, 0], cv2.CV_64F, 1, 0, ksize=1) Nx = cv2.GaussianBlur(Nx, (0, 0), 3.0) Nxx = cv2.Sobel(Nx, cv2.CV_64F, 1, 0, ksize=1) Nxx = cv2.GaussianBlur(Nxx, (0, 0), 5.0) Ny = -cv2.Sobel(N0_32F[:, :, 1], cv2.CV_64F, 0, 1, ksize=1) Ny = cv2.GaussianBlur(Ny, (0, 0), 3.0) Nyy = -cv2.Sobel(Ny, cv2.CV_64F, 0, 1, ksize=1) Nyy = cv2.GaussianBlur(Nyy, (0, 0), 5.0) Nz_L = cv2.Laplacian(cv2.GaussianBlur(N0_32F[:, :, 2], (0, 0), 5.0), cv2.CV_32F, ksize=5) Nz_L_avg = np.average(np.abs(Nz_L)) Nz_L *= 1.0 / Nz_L_avg I_L *= 1.0 / I_L_avg print I_L_avg, Nz_L_avg Nz_L = np.clip(Nz_L, -5.0, 5.0) I_L = np.clip(I_L, -5.0, 5.0) plot_grid.showColorMap(N0_32F[:, :, 0], r"$N_{x}$", v_min=-0.01, v_max=0.01) plot_grid.showColorMap(N0_32F[:, :, 1], r"$N_{y}$", v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Nx, r"$N_{xx}$", v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Ny, r"$N_{yy}$", v_min=-0.01, v_max=0.01) plot_grid.showColorMap(Nz_L, r"$Nz_L$") # plot_grid.showColorMap(Nx + Ny, r'$N_{xx} + N_{yy}$', v_min=-0.01, v_max=0.01) # Ixx[Ixx>0] = 1.0 # Ixx[Ixx<0] = -1.0 # Iyy[Iyy>0] = 1.0 # Iyy[Iyy<0] = -1.0 plot_grid.showColorMap(-Ix, r"$I_{x}$", v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Iy, r"$I_{y}$", v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Ixx, r"$I_{xx}$", v_min=-0.001, v_max=0.001) plot_grid.showColorMap(-Iyy, r"$I_{yy}$", v_min=-0.001, v_max=0.001) plot_grid.showColorMap(I_L, r"$I_L$") # plot_grid.showColorMap(-Ixx - Iyy, r'$I_{xx} + I_{yy}$', v_min=-0.01, v_max=0.01) # plot_grid.showColorMap(Iy, r'$I_{y}$') showMaximize()
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)