2024-10-11 15:35:48 +01:00
"""
Author : Emil Mirzayev
This script removes the background from images in a specified directory and its subfolders .
It processes JPG and JPEG files , converting them to PNG files with transparent backgrounds .
"""
import os
import argparse
from rembg import remove
from PIL import Image
import glob
from tqdm import tqdm
def remove_background ( input_path , output_path ) :
"""
Remove the background from a single image .
Args :
input_path ( str ) : Path to the input image file .
output_path ( str ) : Path where the processed image will be saved .
"""
with Image . open ( input_path ) as img :
output = remove ( img )
output . save ( output_path )
def process_directory ( directory ) :
"""
Process all JPG and JPEG images in the given directory and its subfolders .
Args :
directory ( str ) : Path to the directory containing images .
Returns :
int : The number of images successfully processed .
"""
processed_count = 0
# Get the total number of files to process
total_files = sum ( len ( files ) for _ , _ , files in os . walk ( directory ) )
# Create a progress bar
with tqdm ( total = total_files , desc = " Processing images " , unit = " image " ) as pbar :
for subdir , dirs , files in os . walk ( directory ) :
for file in files :
2024-10-12 20:30:52 +01:00
if file . lower ( ) . endswith ( ( ' .jpg ' , ' .jpeg ' , ' png ' ) ) :
2024-10-11 15:35:48 +01:00
input_path = os . path . join ( subdir , file )
output_filename = os . path . splitext ( file ) [ 0 ] + ' .png '
output_path = os . path . join ( subdir , output_filename )
try :
remove_background ( input_path , output_path )
processed_count + = 1
except Exception as e :
print ( f " Error processing { input_path } : { str ( e ) } " )
# Update the progress bar
pbar . update ( 1 )
return processed_count
def main ( ) :
"""
Main function to parse command - line arguments and initiate the background removal process .
"""
parser = argparse . ArgumentParser ( description = " Remove background from images in a directory and its subfolders " )
parser . add_argument ( " --directory " , type = str , default = " generated_images " , help = " Path to the directory containing images. Defaults to `generated_images` folder in the same directory " )
args = parser . parse_args ( )
total_processed = process_directory ( args . directory )
print ( f " \n Total images processed: { total_processed } " )
if __name__ == " __main__ " :
main ( )