thresh
thresh

Reputation: 11

Change colors of photos in PIL

So in my coursework, I am supposed to change the different variations of colors and get an image that looks like the example provided. I have gotten halfway there, but for the life of me cannot figure out how to get the colors to change, even a little bit. Even if the code runs without errors, the colors will not change

i've tried numpy arrays, editing the pixel color, etc. I can not get anything to work.

import PIL
from PIL import Image
from PIL import ImageEnhance
from PIL import ImageDraw
from PIL import ImageFont

fnt = ImageFont.truetype('readonly/fanwood-webfont.ttf', 75)
# read image and convert to RGB
image=Image.open("readonly/msi_recruitment.gif")
image=image.convert('RGB')
drawing_object = ImageDraw.Draw(image)

# build a list of 9 images which have different brightnesses
enhancer=ImageEnhance.Brightness(image)
images=[]
x = 1
for i in range(0, 10):
    pixels = img.load()
    print(image.size)
    x  += 1
    z = x 
    if x%3 == 1 :
        z = 9
        drawing_object.rectangle((0,450,800,325), fill='black')
        drawing_object.text((20,350),'channel intensity o 0.{}'.format(z), font=fnt, fill=(255,255,255))

    elif x%3 == 0:
        z = 5
        drawing_object.rectangle((0,450,800,325), fill='black')
        drawing_object.text((20,350),'channel intensity o 0.{}'.format(z), font=fnt, fill=(255,255,255))

    else: 
        z = 1
    drawing_object.rectangle((0,450,800,325), fill='black')
    drawing_object.text((20,350),'channel intensity o 0.{}'.format(z), font=fnt, fill=(255,255,255))

    images.append(enhancer.enhance(10/10))

## create a contact sheet from different brightnesses
first_image=images[0]
contact_sheet=PIL.Image.new(first_image.mode, (first_image.width*3,first_image.height*3))
x=0
y=0

for img in images:
    # Lets paste the current image into the contact sheet

    contact_sheet.paste(img, (x, y) )
    # Now we update our X position. If it is going to be the width of the image, then we set it to 0
    # and update Y as well to point to the next "line" of the contact sheet.
    if x+first_image.width == contact_sheet.width:
        x=0
        y=y+first_image.height
    else:
        x=x+first_image.width



# resize and display the contact sheet
contact_sheet = contact_sheet.resize((int(contact_sheet.width/2),int(contact_sheet.height/2) ))
display(contact_sheet)

Upvotes: 1

Views: 2485

Answers (2)

b_c
b_c

Reputation: 1212

It looks like you have a typo in your loop:

for i in range(0, 10):
    # if-elses
    ...

    images.append(enhancer.enhance(10/10))

You're enhancing the image with a factor of 1.0 at each iteration, which according to the docs:

Adjust image brightness.

This class can be used to control the brightness of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image.

Using z, which I suspect was your intention, will give you the tiers of brightness your comments describe:

for i in range(0, 10):
    # if-elses
    ...

    images.append(enhancer.enhance(z/10))

Edit: changed assumed value from i to z, based on the text you're writing.

I should also point out that you probably want to create a temp "watermark" image during the for-loop to apply the text/rectangle to. Since the ImageDraw objects modify the image in-place, you're applying the text on top of each other at each iteration, causing some weird text on the later images.

Upvotes: 0

Max Kaha
Max Kaha

Reputation: 922

So in general you can use OpenCVs ColorMap to change colors in your image:

import cv2
img = cv2.imread(r"<IMAGE PATH>")
img = cv2.applyColorMap(img, cv2.COLORMAP_JET) # Change colors of image with predefined colormap

# Display the new image
cv2.imshow("img", img)
cv2.waitKey()

Now if you want to create your own colormap instead of using a predefined one in OpenCV you can do it with cv2.LUT() (OpenCV Documentation)

Example Input:
enter image description here

Example Output:
enter image description here

And here would be a quick example of how to change Gamma with this approach:

def adjust_gamma(img, gamma=1.0):
    assert (img.shape[0] == 1)
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) *
                      255 for i in np.arange(0, 256)]).astype("uint8")
    new_img = cv2.LUT(np.array(img, dtype=np.uint8), table)
    return new_img 

Upvotes: 1

Related Questions