mirror of
https://github.com/KichangKim/DeepDanbooru.git
synced 2026-10-27 21:49:05 +08:00
70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
import math
|
|
|
|
import numpy as np
|
|
import skimage.transform
|
|
|
|
|
|
def calculate_image_scale(source_width, source_height, target_width, target_height):
|
|
"""
|
|
Calculate scale for image resizing while preserving aspect ratio.
|
|
"""
|
|
if source_width == target_width and source_height == target_height:
|
|
return 1.0
|
|
|
|
source_ratio = source_width / source_height
|
|
target_ratio = target_width / target_height
|
|
|
|
if target_ratio < source_ratio:
|
|
scale = target_width / source_width
|
|
else:
|
|
scale = target_height / source_height
|
|
|
|
return scale
|
|
|
|
|
|
def transform_and_pad_image(
|
|
image,
|
|
target_width,
|
|
target_height,
|
|
scale=None,
|
|
rotation=None,
|
|
shift=None,
|
|
order=1,
|
|
mode="edge",
|
|
):
|
|
"""
|
|
Transform image and pad by edge pixles.
|
|
"""
|
|
image_width = image.shape[1]
|
|
image_height = image.shape[0]
|
|
image_array = image
|
|
|
|
# centerize
|
|
t = skimage.transform.AffineTransform(
|
|
translation=(-image_width * 0.5, -image_height * 0.5)
|
|
)
|
|
|
|
if scale:
|
|
t += skimage.transform.AffineTransform(scale=(scale, scale))
|
|
|
|
if rotation:
|
|
radian = (rotation / 180.0) * math.pi
|
|
t += skimage.transform.AffineTransform(rotation=radian)
|
|
|
|
t += skimage.transform.AffineTransform(
|
|
translation=(target_width * 0.5, target_height * 0.5)
|
|
)
|
|
|
|
if shift:
|
|
t += skimage.transform.AffineTransform(
|
|
translation=(target_width * shift[0], target_height * shift[1])
|
|
)
|
|
|
|
warp_shape = (target_height, target_width)
|
|
|
|
image_array = skimage.transform.warp(
|
|
image_array, (t).inverse, output_shape=warp_shape, order=order, mode=mode
|
|
)
|
|
|
|
return image_array
|