diff --git a/GreenRemover/greenremover.py b/GreenRemover/greenremover.py new file mode 100644 index 0000000..941066b --- /dev/null +++ b/GreenRemover/greenremover.py @@ -0,0 +1,79 @@ +#**********722871********** +# Date: 1/4/2025 +# Programmer: Kyle Gilbert +# Program Name: GreenRemover +# Program Description: Removes green from an image without making the image ugly. +#************************** + +import math +import sys +from PIL import Image + +def print_usage(): + print("Usage: greenremover ") + print("") + print(" : The path of an image to remove green from.") + print(" : The output path for the new image without green.") + print("") + print(" The output is the same as the original image, but with no green.") + +def lerp_color(colorA: tuple[int, int, int], colorB: tuple[int, int, int], time: float): + diffR = colorB[0] - colorA[0] + diffG = colorB[1] - colorA[1] + diffB = colorB[2] - colorA[2] + + return (int(colorA[0] + diffR * time), + int(colorA[1] + diffG * time), + int(colorA[2] + diffB * time)) + +def convert_color(color: tuple[int, int, int]) -> tuple[int, int, int]: + red = color[0] + blue = color[2] + + # arithmetic mean: (a+b)/2. works well (and looks nice), but red becomes orange and blue becomes cyan. + #mean = (red + blue) // 2 + + # geometric mean: sqrt(ab). keeps the hues how they should be + mean = int(math.sqrt((red / 255) * (blue / 255)) * 255) + + return (red, mean, blue) + +def convert_image(in_image: Image.Image, out_image: Image.Image): + PRINT_EVERY = 150_000 + total_size = in_image.size[0] * in_image.size[1] + print(f"Converting... ({in_image.size[0]}x{in_image.size[1]}, {total_size} pix)") + + in_pix = in_image.getdata() + counter = 0 + for y in range(in_image.size[1]): + for x in range(in_image.size[0]): + index = y * in_image.size[0] + x + out_image.putpixel((x, y), convert_color(in_pix[index])) + counter += 1 + if counter % PRINT_EVERY == PRINT_EVERY - 1: + percent = round(100.0 * counter / total_size, 1) + print(f"\r{percent}% ", end="") + sys.stdout.flush() + print("\r ! Done") + +def main(argv: list[str]): + argc: int = len(argv) + if argc < 3: + print_usage() + return + elif argc > 3: + print("Too many arguments!\n") + print_usage() + return + + image_path: str = argv[1] + output_path: str = argv[2] + + in_image = Image.open(image_path).convert("RGB") + out_image = Image.new("RGB", in_image.size) + + convert_image(in_image, out_image) + + out_image.save(output_path) + +if __name__ == "__main__": main(sys.argv) diff --git a/README.md b/README.md index b1a514f..6e52645 100644 --- a/README.md +++ b/README.md @@ -55,3 +55,6 @@ I have about 1-2 weeks for each project. Check the Git commits for specific date - Took me less than an hour to write. Faster than I expected. - Handles hundreds of nodes with very little optimization. - Might improve in the future to work around obstacles. +- GreenRemover/ + - A python script that removes green from an image while keeping white looking normal. + - Not perfect, for example yellow is changed, but it's pretty good otherwise.