Home > Back-end >  Randomizing Algorithm for a Pointillism painting in Python
Randomizing Algorithm for a Pointillism painting in Python

Time:10-24

NOTE: This is a school-related assignment and I am in no capacity looking for a direct answer. Looking for support on coming up with algorithms as this is my first time with such a question

Programs Intended Purpose: Take a command line provided image and scale it up by a unit of 5. Use the RGB values from the original image to re-create it in a randomized fashion.

Algorithm Attempts:

  • Test image is 250x250 scaling up to 1250x1250. I've tried to break this into sections of 50(original image side divided by 5) and then use (r g b)/5 number of circles to generate the color needed. Ex: Color: (100,50,5) would use 20 red circles, 10 green circles, 1 blue circle in the 50x50 space, (100 50 5)/5 = 31, 20 10 1 = 31. The x and y coordinates of these circles inside the 50x50 space should be random.

My main issue here has been putting this into code.

Code Attempt 1: Is not related to algorithm, is simply attempt to print image using pygame.draw.circle(this is what I am required to use to make the circle)

import pygame
import sys
import random


image_name = sys.argv[1]

#Import Image
src_image = pygame.image.load(image_name)

(w,h) = src_image.get_size()

window = pygame.display.set_mode((w*5,h*5))


#Nested Loop To Iterate Through Rows And Columns Of Pixels

for y in range(h):
    for x in range(w):
        (r,g,b,_) = src_image.get_at((x,y))
        print(f"{r},{g},{b},x:{x},y:{y}")
    
        pygame.draw.circle(window,(r,g,b),(x*5,y*5),2)
            
pygame.display.update()
pygame.time.delay(5000)

CodePudding user response:

Possible Solution, works as intended but is still a bit messy due to the randomization:

By dividing the r, g and b values by the scaling value, in this case 5, we get the number of circles needed to be drawn of each color in each block which is broken down to increments of 15. (reduced from 50 to allow more curves and edges of images to be shown as they were hidden with a randomization area of 50). Further luminance calculation is used to find any dark spots, specifically black, and prevent color from being printed in that section. 3 while loops are used to draw each colors separately as they are all drawn a different amount of times.

import pygame
import sys
import random

pygame.init()
image_name = sys.argv[1]

#Import Image
src_image = pygame.image.load(image_name)
#Get image size
(w,h) = src_image.get_size()
#Scale up and display window
window = pygame.display.set_mode((w*5,h*5))


#Nested Loop To Iterate Through Rows And Columns Of Pixels

for y in range(h):
    for x in range(w):
        #Get rgb values at x and y of image
        (r,g,b,_) = src_image.get_at((x,y))
        #chck if area is black
        lum = (0.2126 * r   0.7152 * g   0.0788 * b)*255
        #Calculate required number of circles
        a = int(r/5)
        k = int(g/5)
        d = int(b/5)
        #draw required number of circles
        while(a > 0):
            if(lum > 0.625):
                pygame.draw.circle(window,(255,0,0),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
                a-=1
        
        while(k > 0):
            if(lum > 0.625):
                pygame.draw.circle(window,(0,255,0),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
                k-=1
        while(d > 0):
            if(lum > 0.625):
                pygame.draw.circle(window,(0,0,255),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
                d-=1

            
#update screen  
pygame.display.update()
#Keep window open until closed by user
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

CodePudding user response:

You have to initialize pygame, before you can use any pygame feature:

pygame.init()
src_image = pygame.image.load(image_name)

You have to handle the events in the application loop. See pygame.event.get() respectively pygame.event.pump():

For each frame of your game, you will need to make some sort of call to the event queue. This ensures your program can internally interact with the rest of the operating system.

It is recommended to use an application loop.

Create a list of colors and shuffle it with random.shuffle:

import pygame
import sys
import random

pygame.init()

#Import Image
image_name = sys.argv[1]
src_image = pygame.image.load(image_name)

(w,h) = src_image.get_size()
window = pygame.display.set_mode((w*5,h*5))

for y in range(h):
    for x in range(w):
        (r, g, b, _) = src_image.get_at((x,y))
        lum = (0.2126 * r   0.7152 * g   0.0788 * b)*255
        if lum > 0.625:
            a, k, d = r // 5, g // 5, b // 5
            colors = [(255,0,0) for _ in range(a)]   [(0,255,0) for _ in range(k)]   [(0,0,255) for _ in range(d)]
            random.shuffle(colors)
            for c in colors:
                pygame.draw.circle(window,c,(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False           

    pygame.display.update()
    pygame.time.delay(100)

pygame.quit()
  • Related