Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

alternative implantation of "Forbid too small crop region" #16617

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions modules/masking.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,33 @@ def expand_crop_region(crop_region, processing_width, processing_height, image_w
return x1, y1, x2, y2


def expand_too_small_crop_region(crop_region, processing_width, processing_height, image_width, image_height):
"""expands a crop_region to not have dimensions smaller than processing_dimensions"""

def _expand_segment(c1, c2, desirable_length, maximal_coordinate):
"""expands the segment given by c1 c2 to the desired_dimension but not exceeding the boundaries of the maximal_coordinate"""
if (diff := desirable_length + c1 - c2) > 0:
# if the region is smaller than desirable_length, extend both sides equally
diff_l = diff // 2
c1 -= diff_l
c2 += diff - diff_l
if c1 < 0: # shift the region to the right by c1
c2 = min(c2 - c1, maximal_coordinate) # ensure c2 is within maximal_coordinate
c1 = 0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why = 0 and when c2 -= c1; c1 -= c1 is more readable. Also if is better then min in this case

Copy link
Collaborator Author

@w-e-w w-e-w Oct 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why = 0

imo c1 = 0 you read and see that something is just 0
while c1 -= c1 you need to think about it for a sec
not important in the grand scheme of things

Also if is better then min in this case

can't agree, I think min an max makes code cleaner

Copy link
Contributor

@light-and-ray light-and-ray Oct 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why = 0

imo c1 = 0 you read and see that something is just 0
while c1 -= c1 you need to think about it for a sec

Imo c1 -= c1 doesn't require any thoughts that it's 0, and without min function c2 -= c1 in pair with c1 -= c1 tells you that you're shifting the segment

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

still not convinced if is more readable

def expand_too_small_crop_region(crop_region, processing_width, processing_height, image_width, image_height):
    """expands a crop_region to not have dimensions smaller than processing_dimensions"""

    def _expand_segment(c1, c2, desirable_length, maximal_coordinate):
        """expands the segment given by c1 c2 to the desired_dimension but not exceeding the boundaries of the maximal_coordinate"""
        diff = desirable_length + c1 - c2
        if diff > 0:
            # if the region is smaller than desirable_length, extend both sides equally
            diff_l = diff // 2
            c1 -= diff_l
            c2 += diff - diff_l
            if c1 < 0:  # shift the region to the right by c1
                c2 -= c1
                c1 = 0
                if c2 > maximal_coordinate:
                    c2 = maximal_coordinate
            elif c2 >= maximal_coordinate:  # shift the region to the left by (c2 - maximal_coordinate)
                c1 -= c2 - maximal_coordinate
                c2 = maximal_coordinate
                if c1 < 0:
                    c1 = 0
        return c1, c2

    x1, y1, x2, y2 = crop_region

elif c2 >= maximal_coordinate: # shift the region to the left by (c2 - maximal_coordinate)
c1 = max(c1 - c2 + maximal_coordinate, 0) # ensure c1 is not below 0
c2 = maximal_coordinate
return c1, c2

x1, y1, x2, y2 = crop_region
x1, x2 = _expand_segment(x1, x2, processing_width, image_width)
y1, y2 = _expand_segment(y1, y2, processing_height, image_height)
new_crop_region = x1, y1, x2, y2
if new_crop_region != crop_region:
print("Crop region was smaller then resolution and has been corrected")
return new_crop_region


def fill(image, mask):
"""fills masked regions with colors from image using blur. Not extremely effective."""

Expand Down
2 changes: 2 additions & 0 deletions modules/processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1639,6 +1639,8 @@ def init(self, all_prompts, all_seeds, all_subseeds):
crop_region = masking.get_crop_region_v2(mask, self.inpaint_full_res_padding)
if crop_region:
crop_region = masking.expand_crop_region(crop_region, self.width, self.height, mask.width, mask.height)
if shared.opts.forbid_too_small_crop_region:
crop_region = masking.expand_too_small_crop_region(crop_region, self.width, self.height, mask.width, mask.height)
x1, y1, x2, y2 = crop_region
mask = mask.crop(crop_region)
image_mask = images.resize_image(2, mask, self.width, self.height)
Expand Down
1 change: 1 addition & 0 deletions modules/shared_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@
"return_mask_composite": OptionInfo(False, "For inpainting, include masked composite in results for web"),
"img2img_batch_show_results_limit": OptionInfo(32, "Show the first N batch img2img results in UI", gr.Slider, {"minimum": -1, "maximum": 1000, "step": 1}).info('0: disable, -1: show all images. Too many images can cause lag'),
"overlay_inpaint": OptionInfo(True, "Overlay original for inpaint").info("when inpainting, overlay the original image over the areas that weren't inpainted."),
"forbid_too_small_crop_region": OptionInfo(False, "Forbid too small crop region").info("Correct inpaint padding for only masked to avoid crop region sides less then processing resolution"),
}))

options_templates.update(options_section(('optimizations', "Optimizations", "sd"), {
Expand Down