[ \mathcalL = |I_pred - I_gt| 2^2 + \lambda_1 |\nabla I pred - \nabla I_gt| 1 + \lambda_2 |I pred \cdot B - I_gt \cdot B|_1 ]
plt.subplot(1,2,1); plt.imshow(original, cmap='gray'); plt.title('Original') plt.subplot(1,2,2); plt.imshow(binary_mask, cmap='gray'); plt.title('Binary Mask') plt.show() A baseline P3D-inspired approach uses the Euclidean distance transform to create a height map from the binary edges. p3d debinarizer
import torch import torch.nn as nn class SimpleP3DUNet(nn.Module): def (self): super(). init () self.encoder = nn.Sequential( nn.Conv2d(2, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(128, 256, 3, padding=1), nn.ReLU() ) self.decoder = nn.Sequential( nn.ConvTranspose2d(256, 128, 2, stride=2), nn.ReLU(), nn.ConvTranspose2d(128, 64, 2, stride=2), nn.ReLU(), nn.Conv2d(64, 1, 3, padding=1), nn.Sigmoid() ) [ \mathcalL = |I_pred - I_gt| 2^2 +
The P3D approach adds a third dimension: or spatial depth . This method works surprisingly well for shapes with
This method works surprisingly well for shapes with smooth gradients but fails for textures. For true 3D awareness, we train a small U-Net that takes the binary mask plus a depth map (the P3D prior) and outputs a grayscale image.
Additionally, on-device P3D debinarizers are emerging for AR/VR headsets, where binary depth masks are upscaled in real-time to photorealistic intensity maps using dedicated NPU cores. If you are working with thresholded images , segmented masks , or binary depth maps —and you need to recover plausible intensity gradients for human viewing or downstream algorithms—then implementing or adopting a P3D debinarizer is a game-changer.