Commit
·
7b59237
1
Parent(s):
c1b91e0
Factor some code for library use.
Browse files- mapped_downscale.py +54 -26
mapped_downscale.py
CHANGED
|
@@ -227,14 +227,56 @@ def downsample_all(*, input_image: Image.Image, output_image: Optional[ImageRef]
|
|
| 227 |
def str2bool(value) -> bool:
|
| 228 |
if isinstance(value, bool):
|
| 229 |
return value
|
| 230 |
-
if value.lower() in ("
|
| 231 |
return True
|
| 232 |
-
elif value.lower() in ("
|
| 233 |
return False
|
| 234 |
else:
|
| 235 |
raise argparse.ArgumentTypeError("Boolean value expected.")
|
| 236 |
|
| 237 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 238 |
def main(cli_args: List[str]) -> None:
|
| 239 |
parser = argparse.ArgumentParser(description="Downsample and rescale image.")
|
| 240 |
parser.add_argument("--control", required=True, help="Path to control image.")
|
|
@@ -246,31 +288,17 @@ def main(cli_args: List[str]) -> None:
|
|
| 246 |
parser.add_argument("--trim-cropped-edges", type=str2bool, default=False, help="Drop mapped checker grid elements that are cropped in the control image.")
|
| 247 |
|
| 248 |
args = parser.parse_args(cli_args)
|
| 249 |
-
|
| 250 |
-
control_image = Image.open(args.control).convert("1")
|
| 251 |
-
input_image = Image.open(args.input)
|
| 252 |
-
if control_image.size != input_image.size:
|
| 253 |
-
raise ValueError("Control image and input image must have the same dimensions.")
|
| 254 |
downsampler = Image.Resampling[args.downsampler.upper()]
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
boxes = extracted_boxes.boxes()
|
| 266 |
-
|
| 267 |
-
print(args.trim_cropped_edges)
|
| 268 |
-
|
| 269 |
-
downsample_all(input_image=input_image, output_image=output_image, down_image=down_image, boxes=boxes, sample_radius=args.sample_radius, downsampler=downsampler, trim_cropped_edges=args.trim_cropped_edges)
|
| 270 |
-
if output_image:
|
| 271 |
-
output_image.ref.save(args.output_up)
|
| 272 |
-
if down_image:
|
| 273 |
-
down_image.ref.save(args.output_down)
|
| 274 |
|
| 275 |
|
| 276 |
if __name__ == "__main__":
|
|
|
|
| 227 |
def str2bool(value) -> bool:
|
| 228 |
if isinstance(value, bool):
|
| 229 |
return value
|
| 230 |
+
if value.lower() in ("true", "1"):
|
| 231 |
return True
|
| 232 |
+
elif value.lower() in ("false", "0"):
|
| 233 |
return False
|
| 234 |
else:
|
| 235 |
raise argparse.ArgumentTypeError("Boolean value expected.")
|
| 236 |
|
| 237 |
|
| 238 |
+
def mapped_downscale(*, control_path: str, input_path: str, output_up_path: Optional[str], output_down_path: Optional[str], sample_radius: Optional[int], downsampler: Image.Resampling, trim_cropped_edges: bool) -> None:
|
| 239 |
+
"""
|
| 240 |
+
Downsample and rescale an image.
|
| 241 |
+
|
| 242 |
+
:param control_path: Path to the control image.
|
| 243 |
+
:param input_path: Path to the input image.
|
| 244 |
+
:param output_up_path: Path to save the output image, upscaled to the original size.
|
| 245 |
+
:param output_down_path: Path to save the output image, kept at the downsampled size.
|
| 246 |
+
:param sample_radius: Radius for sampling (Manhattan distance).
|
| 247 |
+
:param downsampler: Downsampler to use.
|
| 248 |
+
:param trim_cropped_edges: Drop mapped checker grid elements that are cropped in the control image.
|
| 249 |
+
"""
|
| 250 |
+
control_image = Image.open(control_path).convert("1")
|
| 251 |
+
input_image = Image.open(input_path)
|
| 252 |
+
if control_image.size != input_image.size:
|
| 253 |
+
raise ValueError("Control image and input image must have the same dimensions.")
|
| 254 |
+
|
| 255 |
+
output_image: Optional[ImageRef] = None
|
| 256 |
+
down_image: Optional[ImageRef] = None
|
| 257 |
+
|
| 258 |
+
if not output_up_path and not output_down_path:
|
| 259 |
+
raise ValueError("At least one of output_up and output_down must be specified.")
|
| 260 |
+
|
| 261 |
+
if output_up_path:
|
| 262 |
+
output_image = ImageRef(Image.new("RGB", input_image.size))
|
| 263 |
+
|
| 264 |
+
extracted_boxes = extract_boxes(control_image)
|
| 265 |
+
|
| 266 |
+
if output_down_path:
|
| 267 |
+
down_image = ImageRef(Image.new("RGB", extracted_boxes.down_dimensions()))
|
| 268 |
+
|
| 269 |
+
boxes = extracted_boxes.boxes()
|
| 270 |
+
downsample_all(input_image=input_image, output_image=output_image, down_image=down_image, boxes=boxes, sample_radius=sample_radius, downsampler=downsampler, trim_cropped_edges=trim_cropped_edges)
|
| 271 |
+
|
| 272 |
+
if output_image:
|
| 273 |
+
assert output_up_path
|
| 274 |
+
output_image.ref.save(output_up_path)
|
| 275 |
+
if down_image:
|
| 276 |
+
assert output_down_path
|
| 277 |
+
down_image.ref.save(output_down_path)
|
| 278 |
+
|
| 279 |
+
|
| 280 |
def main(cli_args: List[str]) -> None:
|
| 281 |
parser = argparse.ArgumentParser(description="Downsample and rescale image.")
|
| 282 |
parser.add_argument("--control", required=True, help="Path to control image.")
|
|
|
|
| 288 |
parser.add_argument("--trim-cropped-edges", type=str2bool, default=False, help="Drop mapped checker grid elements that are cropped in the control image.")
|
| 289 |
|
| 290 |
args = parser.parse_args(cli_args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 291 |
downsampler = Image.Resampling[args.downsampler.upper()]
|
| 292 |
+
|
| 293 |
+
mapped_downscale(
|
| 294 |
+
control_path=args.control,
|
| 295 |
+
input_path=args.input,
|
| 296 |
+
output_up_path=args.output_up,
|
| 297 |
+
output_down_path=args.output_down,
|
| 298 |
+
sample_radius=args.sample_radius,
|
| 299 |
+
downsampler=downsampler,
|
| 300 |
+
trim_cropped_edges=args.trim_cropped_edges
|
| 301 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
|
| 303 |
|
| 304 |
if __name__ == "__main__":
|