BrizZ
BrizZ

Reputation: 11

Python Changing color for every n-th pixel on x and y axis

As the title says, I have to take an image and write code that colors in every n-th pixel on x axis and y axis.

I've tried using for loops, but it colors in the whole axis line instead of the one pixel that i need. I either have to use OpenCV or Pillow for this task.

#pillow
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

picture = Image.open('e92m3.jpg')

picture_resized = picture.resize( (500,500) )

pixels = picture_resized.load()
#x,y
for i in range(0,500):
    pixels[i,10] = (0,255,0)
for i in range(0,500):
    pixels[10,i] = (255,0,0)

%matplotlib notebook
plt.imshow(picture_resized)

This is how it should approximately look like:

enter image description here

Upvotes: 1

Views: 696

Answers (2)

Mark Setchell
Mark Setchell

Reputation: 208033

You really should avoid for loops with image processing in Python. They are horribly slow and inefficient. As pretty much all image processing suites use Numpy arrays to store images, you should try and use vectorised Numpy access methods such as slicing, indexing and broadcasting:

import numpy as np
import cv2

# Load image
im = cv2.imread('lena.png')

# Use Numpy indexing to make alternate rows and columns black
im[0::2,0::2] = [0,0,0]
im[1::2,1::2] = [0,0,0]

cv2.imwrite('result.png', im)

enter image description here


If you want to use PIL/Pillow in place of OpenCV, load and save the image like this:

from PIL import Image

# Load as PIL Image and make into Numpy array
im = np.array(Image.open('lena.png').convert('RGB'))

... process ...

# Make Numpy array back into PIL Image and save
Image.fromarray(im).save('result.png')

Maybe have a read here about indexing.

Upvotes: 3

Larsluph
Larsluph

Reputation: 159

I don't think I've understood your question but here is my answer on what i understood of it.

def interval_replace(img, offset_x: int=0, interval_x: int, offset_y: int=0, interval_y: int, replace_pxl: tuple):
    for y in range(offset_y, img.shape[0]):
        for x in range(offset_x, img.shape[1]):
            if x % interval_x == 0 and y % interval_y == 0:
               img[y][x] = replace_pxl

Upvotes: 0

Related Questions