Reputation: 13
I'm making a filter/pixel manipulation program. Basically I've finished it all, only bug is that when the user enters something else that is not prompted like 'x' instead of 'a', etc. I've tried a "try:" and "except ValueError:" statement but im guessing that's wrong. This is the important code code:
# Variables for image selection *for assigning string color only*
print("What image would you like to utilize? City Image: 'A', Dog Image: 'B', or Statue of Liberty: 'C'")
# Image selection input
img_input = input('Choose Image: ').casefold()
# Assign image choice char
img_choices = ['a', 'b', 'c']
# If Statements for opening image of choice
if img_input == img_choices[0]:
img = Image.open('subjectIMG.jpg')
elif img_input == img_choices[1]:
img = Image.open('subjectIMG0.jpg')
elif img_input == img_choices[2]:
img = Image.open('subjectIMG2.jpg')
# For visuals only
time.sleep(0.8), print('\nChoosing your image....\n')
time.sleep(0.8), print('Image choosen!\n'), time.sleep(0.8)
# Rescales image to preferred size
width, height = img.width, img.height
xwidth, yheight = width // 1000, height // 1000
if xwidth > yheight:
scale = xwidth
else:
scale = yheight
if scale != 0:
img = img.resize( (width // scale, height // scale) )
# Filter One
def invert_distort(display_algorithm, image_filter_inverted):
# Get pixel data (every pixel) and make new list
pixels_get = img.getdata()
pixel_list = []
# Go through every pixel in image and append every pixel to list
for p in pixels_get:
pixel_list.append(p)
# Pixel location and row
pixel_location = 0
pixel_row = 0
# Begin while loop at index 0 in order to loop through every pixel
while pixel_location < len(pixel_list):
p = pixel_list[pixel_location]
# Prints current row and pixel color values
if display_algorithm == 'y':
print(f'Current row: {pixel_row}: {p}')
pixel_row += 1
if display_algorithm == 'n':
pass
# Pixel Manipulation
# If user enters accordingly, Colors Red, Green, Blue set into variables
xr, xg, xb = 0, 0, 0
if image_filter_inverted in image_filter_inverted_choices[0]:
xr, xg, xb = 0, 1, 2
elif image_filter_inverted in image_filter_inverted_choices[1]:
xr, xg, xb = 2, 2, 2
# Red, Green, Blue sorted into pixel list
r, g, b = p[xr], p[xg], p[xb]
# RGB values assigned to r, g, b
absr, absg, absb = 255, 255, 255
# Absolute value of pixels from red, green blue taken.
# RBG values assigned, stored into variables below.
update_r, update_g, update_b = abs(r-absr), abs(g-absg), abs(b-absb)
# New values assigned at specific pixel location
pixel_list[pixel_location] = (update_r, update_g, update_b)
pixel_location = pixel_location + 1
# New image created using same size and RGB format
final_image = Image.new("RGB", img.size)
final_image.putdata(pixel_list)
# Filter from PIL applied to new image
filter_applied = final_image.filter(ImageFilter.SHARPEN)
return filter_applied
# Filter Two
def drawing_filter(display_algorithm, image_filter_drawing):
# Get pixel data (every pixel) and make new list
pixels_get = img.getdata()
pixel_list = []
# Go through every pixel in image and append every pixel to list
for p in pixels_get:
pixel_list.append(p)
# Pixel location and row
pixel_location = 0
pixel_row = 0
# Begin while loop at index 0 in order to loop through every pixel
while pixel_location < len(pixel_list):
p = pixel_list[pixel_location]
# Prints current row and pixel color values
if display_algorithm == 'y':
print(f'Current row: {pixel_row}: {p}')
pixel_row += 1
if display_algorithm == 'n':
pass
# Pixel Manipulation
# Colors Red, Green, Blue set into variables
xr, xg, xb = 2, 2, 2
# Red, Green, Blue sorted into pixel list
r, g, b = p[xr], p[xg], p[xb]
# RGB values assigned to r, g, b
absr, absg, absb = 255, 255, 255
# Absolute value of pixels from red, green blue taken.
# RBG values assigned, stored into variables below.
update_r, update_g, update_b = abs(r-absr), abs(g-absg), abs(b-absb)
# New values assigned at specific pixel location
pixel_list[pixel_location] = (update_r, update_g, update_b)
pixel_location = pixel_location + 1
# New image created using same size and RGB format
final_image = Image.new("RGB", img.size)
final_image.putdata(pixel_list)
# If statement applies, filter added to new image
# Filter from PIL applied to new image
if image_filter_drawing in image_filter_drawing_choices[0]:
filter_applied = final_image.filter(ImageFilter.CONTOUR)
return filter_applied
elif image_filter_drawing in image_filter_drawing_choices[1]:
filter_applied = final_image.filter(ImageFilter.EMBOSS)
return filter_applied
# Filter Three
def constant_filter(display_algorithm):
# Get pixel data (every pixel) and make new list
pixels_get = img.getdata()
pixel_list = []
# Go through every pixel in image and append every pixel to list
for p in pixels_get:
pixel_list.append(p)
# Pixel location and row
pixel_location = 0
pixel_row = 0
# Begin while loop at index 0 in order to loop through every pixel
while pixel_location < len(pixel_list):
p = pixel_list[pixel_location]
# Prints current row and pixel color values
if display_algorithm == 'y':
print(f'Current row: {pixel_row}: {p}')
pixel_row += 1
if display_algorithm == 'n':
pass
# Pixel Manipulation
# Colors Red, Green, Blue set into variables
xr, xg, xb = 0, 1, 2
# Red, Green, Blue sorted into pixel list
r, g, b = p[xr], p[xg], p[xb]
# RBG values assigned, stored into variables below.
update_r, update_g, update_b = r, g, b
# New values assigned at specific pixel location
pixel_list[pixel_location] = (update_r, update_g, update_b)
pixel_location = pixel_location + 1
# New image created using same size and RGB format
final_image = Image.new("RGB", img.size)
final_image.putdata(pixel_list)
# First Enhance Applied
applyOne = ImageEnhance.Contrast(final_image)
# Second Enhance Applied
applyTwo = applyOne.enhance(0.5)
# Final form stored into new variable
filter_applied = applyTwo
return filter_applied
# Permit user to choose to see algorithm visuals
display_algorithm = input("Would you like to see the back-end (algorithm) process? Enter 'Y' or 'N': ").casefold()
# Takes user input on main filter decision
image_filter_main = input("\nChoose a filter: Inverted: 'A', Drawing: 'B', or Contrast: 'C': ").casefold()
# Main Filter choices
image_filter_main_choices = ['a', 'b', 'c']
# If statments based off user input
# Functions called: invert_distort(), drawing_filter(), constant_filter()
# Function invert_distort() if statment
if image_filter_main in image_filter_main_choices[0]:
# Choose type of filter based off invert filter
image_filter_inverted = input("\nChoose: Negative: 'A' or Monochrome: 'B': ").casefold()
image_filter_inverted_choices = ['a', 'b']
# Begin code duration time
initiate = datetime.now()
# Call function
invert_distort(display_algorithm, image_filter_inverted)
# Store function in a new variable
imageInvert = invert_distort(display_algorithm, image_filter_inverted)
print("\nFinishing your image...")
# Save Image (create new image)
imageInvert.save("InvertIMG.jpg")
# Function drawing_filter() if statement
if image_filter_main in image_filter_main_choices[1]:
# Choose type of filter based off drawing filter
image_filter_drawing = input("\nChoose: Sketch: 'A' or Engraving: 'B': ").casefold()
image_filter_drawing_choices = ['a', 'b']
# Begin code duration time
initiate = datetime.now()
# Call function
drawing_filter(display_algorithm, image_filter_drawing)
# Store function in a new variable
imageDrawing = drawing_filter(display_algorithm, image_filter_drawing)
print("\nFinishing your image...")
# Save Image (create new image)
imageDrawing.save("DrawingIMG.jpg")
# Function constant_filter() if statement
if image_filter_main in image_filter_main_choices[2]:
# Begin code duration time
initiate = datetime.now()
# Call function
constant_filter(display_algorithm)
# Store function in a new variable
imageFirm = constant_filter(display_algorithm)
print("\nFinishing your image...")
# Save Image (create new image)
imageFirm.save("ConstantIMG.jpg")
# End code duration time
# Print total duration of code
terminate = datetime.now()
print('\nDuration to execute code: {}'.format(colored((terminate - initiate), 'blue')))
Sorry for the extremely large snippet, it's just that one input from the top links all the way to the code at the bottom. If anybody can help me I'd gladly appreciate it. Don't know what specific part to include so I included the most important part.
Upvotes: 0
Views: 47
Reputation: 825
You can make it an infinite while loop with an exit option. There are several approaches you can take. But this one changes your code the least.
EXIT_TOKEN = "Q"
img_choices = ['a', 'b', 'c']
# If Statements for opening image of choice
while (img_input:= input('Choose Image: ').casefold()):
if img_input == img_choices[0]:
img = Image.open('subjectIMG.jpg')
elif img_input == img_choices[1]:
img = Image.open('subjectIMG0.jpg')
elif img_input == img_choices[2]:
img = Image.open('subjectIMG2.jpg')
elif img_input == EXIT_TOKEN:
sys.exit()
else:
print(f"Unexpected input: {img_input}")
continue
Upvotes: 0