43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
import numpy as np
|
|
from PIL import Image
|
|
|
|
def create_cylindrical_depth_map(image_path, output_path):
|
|
# Load image
|
|
img = Image.open(image_path).convert("RGBA")
|
|
width, height = img.size
|
|
|
|
# Create a numpy array for the depth map
|
|
# We want a gradient that is white in the center horizontal axis and black at the edges (cylindrical)
|
|
# 0 = far (black), 255 = near (white)
|
|
|
|
# Generate X coordinates (0 to width)
|
|
x = np.linspace(-1, 1, width)
|
|
# Compute cylindrical depth: sqrt(1 - x^2) for a perfect cylinder, or just a cosine/parabolic falloff
|
|
# Let's use cosine for smooth roundness: cos(x * pi / 2)
|
|
depth_profile = np.cos(x * np.pi / 2) # Center (0) is 1, Edges (-1, 1) are 0
|
|
|
|
# Normalize to 0-255
|
|
depth_profile = (depth_profile * 255).astype(np.uint8)
|
|
|
|
# Tile vertically to create the full map
|
|
depth_map = np.tile(depth_profile, (height, 1))
|
|
|
|
# Create Image from array
|
|
depth_img = Image.fromarray(depth_map, mode='L')
|
|
|
|
# MASKING: We only want the vase to have depth, the background (transparent) should be flat/far.
|
|
# Use the alpha channel of the original image as a mask
|
|
alpha = np.array(img.split()[-1])
|
|
|
|
# Where alpha is 0 (background), set depth to 0 (flat/far)
|
|
depth_array = np.array(depth_img)
|
|
depth_array[alpha < 10] = 0 # Threshold for transparency
|
|
|
|
# Save
|
|
final_depth = Image.fromarray(depth_array)
|
|
final_depth.save(output_path)
|
|
print(f"Generated depth map: {output_path}")
|
|
|
|
if __name__ == "__main__":
|
|
create_cylindrical_depth_map("pottery-vase.png", "pottery-vase_depth.png")
|