| import warnings |
| import cv2 |
| import numpy as np |
| from PIL import Image |
| from custom_controlnet_aux.util import get_upscale_method, common_input_validate, HWC3 |
| from .guided_filter import FastGuidedFilter |
|
|
| class TileDetector: |
| def __call__(self, input_image=None, pyrUp_iters=3, output_type=None, upscale_method="INTER_AREA", **kwargs): |
| input_image, output_type = common_input_validate(input_image, output_type, **kwargs) |
| H, W, _ = input_image.shape |
| H = int(np.round(H / 64.0)) * 64 |
| W = int(np.round(W / 64.0)) * 64 |
| detected_map = cv2.resize(input_image, (W // (2 ** pyrUp_iters), H // (2 ** pyrUp_iters)), |
| interpolation=get_upscale_method(upscale_method)) |
| detected_map = HWC3(detected_map) |
|
|
| for _ in range(pyrUp_iters): |
| detected_map = cv2.pyrUp(detected_map) |
|
|
| if output_type == "pil": |
| detected_map = Image.fromarray(detected_map) |
|
|
| return detected_map |
|
|
|
|
| |
|
|
| def apply_gaussian_blur(image_np, ksize=5, sigmaX=1.0): |
| if ksize % 2 == 0: |
| ksize += 1 |
| blurred_image = cv2.GaussianBlur(image_np, (ksize, ksize), sigmaX=sigmaX) |
| return blurred_image |
|
|
| def apply_guided_filter(image_np, radius, eps, scale): |
| filter = FastGuidedFilter(image_np, radius, eps, scale) |
| return filter.filter(image_np) |
|
|
| class TTPlanet_Tile_Detector_GF: |
| def __call__(self, input_image, scale_factor, blur_strength, radius, eps, output_type=None, **kwargs): |
| input_image, output_type = common_input_validate(input_image, output_type, **kwargs) |
| img_np = input_image[:, :, ::-1] |
| |
| |
| img_np = apply_gaussian_blur(img_np, ksize=int(blur_strength), sigmaX=blur_strength / 2) |
|
|
| |
| img_np = apply_guided_filter(img_np, radius, eps, scale_factor) |
|
|
| |
| height, width = img_np.shape[:2] |
| new_width = int(width / scale_factor) |
| new_height = int(height / scale_factor) |
| resized_down = cv2.resize(img_np, (new_width, new_height), interpolation=cv2.INTER_AREA) |
| resized_img = cv2.resize(resized_down, (width, height), interpolation=cv2.INTER_CUBIC) |
| detected_map = HWC3(resized_img[:, :, ::-1]) |
| |
| if output_type == "pil": |
| detected_map = Image.fromarray(detected_map) |
| |
| return detected_map |
|
|
| class TTPLanet_Tile_Detector_Simple: |
| def __call__(self, input_image, scale_factor, blur_strength, output_type=None, **kwargs): |
| input_image, output_type = common_input_validate(input_image, output_type, **kwargs) |
| img_np = input_image[:, :, ::-1] |
| |
| |
| height, width = img_np.shape[:2] |
| new_width = int(width / scale_factor) |
| new_height = int(height / scale_factor) |
| resized_down = cv2.resize(img_np, (new_width, new_height), interpolation=cv2.INTER_AREA) |
| resized_img = cv2.resize(resized_down, (width, height), interpolation=cv2.INTER_LANCZOS4) |
| |
| |
| img_np = apply_gaussian_blur(resized_img, ksize=int(blur_strength), sigmaX=blur_strength / 2) |
| detected_map = HWC3(img_np[:, :, ::-1]) |
| |
| if output_type == "pil": |
| detected_map = Image.fromarray(detected_map) |
| |
| return detected_map |
|
|