Modifying pixels of an image#

We can access the color information of certain columns of images in a similar way. We still have the 3X4 image saved as a 2D list our_image.

../../../_images/rows.png

The RGB values of each pixel is as follows:

(0,0,0)   (0,80,0)   (0,160,0)   (0,240,0)
(120,0,0) (120,80,0) (120,160,0) (120,240,0)
(240,0,0) (240,80,0) (240,160,0) (240,240,0)

Suppose we want to change this. Say you really like the color blue and you want the B component of every pixel to be the maximum value 255. Before writing a complete program, let’s handle a single pixel at the leftmost row and the top column, which is our_image[0][0]. We have learned before that the B component of this pixel can be accessed by our_image[0][0][2].

>>> our_image[0][0][2]
0

So why don’t we just run our_image[0][0][2] = 255? This is what would happen:

>>> our_image[0][0][2] = 255
Traceback (most recent call last):
    File "<pyshell#10>", line 1, in <module>
        our_image[0][0][2] = 255
TypeError: 'tuple' object does not support item assignment

It is impossible to mutate an element of a tuple because tuples are immutable. Then, how can we modify a pixel without mutating a tuple? We can’t modify a tuple, but we CAN reassign the pixel with a new tuple, because this is not against the rule.

our_image[0][0] = (0,0,225)

Implementing this way, we did not try modifying the tuple (0,0,0), but we just reassigned a new tuple (0,0,225) to the pixel. Now, the RGB values and the image are changed as follows:

(0,0,255) (0,80,0)   (0,160,0)   (0,240,0)
(120,0,0) (120,80,0) (120,160,0) (120,240,0)
(240,0,0) (240,80,0) (240,160,0) (240,240,0)