We use arrays to change images because images are just grids of numbers. Changing these numbers changes the picture.
Basic image manipulation with arrays in NumPy
import numpy as np # Load or create an image as a 2D (grayscale) or 3D (color) numpy array image = np.array([...]) # Example image array # Example operations: # 1. Brightness change brighter_image = np.clip(image + 50, 0, 255) # Add 50 to all pixels and clip to valid range # 2. Flip image horizontally flipped_image = np.fliplr(image) # 3. Crop image cropped_image = image[10:100, 20:150] # 4. Convert to grayscale (if color image) gray_image = np.mean(image, axis=2).astype(np.uint8)
Images are stored as arrays where each number represents a pixel's brightness or color.
Use numpy functions to easily manipulate these arrays.
import numpy as np # Empty image (all zeros) empty_image = np.zeros((5, 5), dtype=np.uint8) print(empty_image)
import numpy as np # Single pixel image single_pixel_image = np.array([[255]], dtype=np.uint8) print(single_pixel_image)
import numpy as np # Flip a small image horizontally small_image = np.array([[10, 20, 30], [40, 50, 60]], dtype=np.uint8) flipped = np.fliplr(small_image) print(flipped)
import numpy as np # Crop image edge case: cropping beyond image size image = np.arange(100).reshape(10, 10) cropped = image[8:15, 8:15] print(cropped)
This program creates a small grayscale image as a numpy array. It then makes the image brighter, flips it horizontally, and crops the center part. Each step prints the image array so you can see the changes.
import numpy as np # Create a simple 5x5 grayscale image with values from 10 to 210 original_image = np.array([ [10, 50, 90, 130, 170], [20, 60, 100, 140, 180], [30, 70, 110, 150, 190], [40, 80, 120, 160, 200], [50, 90, 130, 170, 210] ], dtype=np.uint8) print("Original Image:\n", original_image) # Increase brightness by 40 (clip max to 255) brighter_image = np.clip(original_image + 40, 0, 255).astype(np.uint8) print("\nBrighter Image:\n", brighter_image) # Flip image horizontally flipped_image = np.fliplr(original_image) print("\nFlipped Image (Left-Right):\n", flipped_image) # Crop the center 3x3 area cropped_image = original_image[1:4, 1:4] print("\nCropped Image (3x3 center):\n", cropped_image)
Brightness change operation runs in O(n*m) time where n and m are image dimensions.
Flipping and cropping also run in O(n*m) time but are very fast with numpy.
Common mistake: Not clipping values after brightness change can cause overflow and wrong colors.
Use cropping to focus on parts of an image; use flipping to mirror images easily.
Images are arrays of numbers representing pixels.
You can change images by adding, flipping, or slicing these arrays.
Numpy makes these operations simple and fast.
Practice
Solution
Step 1: Understand image representation
A grayscale image is made of pixels arranged in rows and columns, each pixel having a brightness value.Step 2: Connect to numpy array structure
A 2D numpy array stores these brightness values in a grid matching the image layout.Final Answer:
Pixel brightness values arranged in rows and columns -> Option AQuick Check:
Grayscale image = 2D pixel brightness array [OK]
- Confusing pixel values with file names
- Thinking 2D arrays store color channels
- Mixing image size with pixel data
img vertically?Solution
Step 1: Understand vertical flip axis
Vertical flip reverses rows, which corresponds to axis 0 in numpy arrays.Step 2: Match numpy functions to axis
np.flip(img, axis=0) flips vertically.Final Answer:
np.flip(img, axis=0) -> Option CQuick Check:
Vertical flip = axis 0 flip [OK]
- Using axis=1 flips horizontally
- np.flip(img) without axis reverses all axes
- Forgetting axis parameter in np.flip
import numpy as np img = np.array([[10, 20], [30, 40]]) new_img = img + 5 print(new_img)
What is the output?
Solution
Step 1: Understand numpy array addition
Adding 5 to a numpy array adds 5 to every element (broadcasting).Step 2: Calculate new array values
Each element increases by 5: 10+5=15, 20+5=25, 30+5=35, 40+5=45.Final Answer:
[[15 25] [35 45]] -> Option DQuick Check:
Array + 5 adds 5 to all elements [OK]
- Thinking addition changes shape
- Adding 5 only to first row or column
- Confusing addition with multiplication
img?:cropped = img[0:2, 0:3]
Solution
Step 1: Analyze slicing indices
The slice img[0:2, 0:3] selects rows 0 and 1 (2 rows) and columns 0,1,2 (3 columns).Step 2: Compare to desired crop size
We want a 2x2 crop, but this selects 2x3, so it includes one extra column.Final Answer:
It crops 2 rows but 3 columns, not 2 columns -> Option AQuick Check:
Slicing columns 0:3 selects 3 columns [OK]
- Assuming slicing is exclusive of end index
- Expecting error from out-of-range slice
- Confusing rows and columns order
img with shape (100, 100, 3). How do you create a new image gray_img by averaging the color channels for each pixel?Solution
Step 1: Understand image shape and channels
The shape (100, 100, 3) means 100x100 pixels with 3 color channels (RGB) along axis 2.Step 2: Average color channels per pixel
Using img.mean(axis=2) calculates the average of the 3 channels for each pixel, producing a 2D grayscale image.Final Answer:
gray_img = img.mean(axis=2) -> Option BQuick Check:
Mean over axis 2 averages color channels [OK]
- Summing over wrong axis
- Selecting only one color channel
- Using flip instead of averaging
Ready to prove it?
Pass the test and this pattern moves unknown
