Spaces:
Running
Running
| import cv2 | |
| import random | |
| import numpy as np | |
| from PIL import Image | |
| #Author: Alican Akca | |
| class pixL: | |
| def __init__(self,numOfSquaresW = None, numOfSquaresH= None, size = [True, (512,512)],square = 6,ImgH = None,ImgW = None,image = None,background = None, pixValues = []): | |
| self.size = size | |
| self.ImgH = ImgH | |
| self.ImgW = ImgW | |
| self.image = image | |
| self.square = square | |
| self.pixValues = pixValues | |
| self.background = background | |
| self.numOfSquaresW = numOfSquaresW | |
| self.numOfSquaresH = numOfSquaresH | |
| def toThePixL(self,image, pixel_size, segMode= False): | |
| self.square = pixel_size | |
| self.image = Image.fromarray(image).convert("RGB").resize((512,512)) | |
| self.ImgW, self.ImgH = self.image.size | |
| self.image = pixL.colorPicker(self) | |
| pixL.complier(self) | |
| if segMode == True: | |
| return pixL.postprocess(self), self.pixValues | |
| else: | |
| return pixL.postprocess(self) | |
| def postprocess(self): | |
| image = self.background | |
| size = (image.shape[0] - (image.shape[0] % 4), image.shape[1] - (image.shape[1] % 4)) | |
| image = cv2.resize(image, size) | |
| return image | |
| def numOfSquaresFunc(self): | |
| self.numOfSquaresW = round((self.ImgW / self.square) + 1) | |
| self.numOfSquaresH = round((self.ImgH / self.square) + 1) | |
| def optimizer(RGB): | |
| R_ = RGB[2] | |
| G_ = RGB[1] | |
| B_ = RGB[0] | |
| if R_ < 50 and G_ < 50 and B_ < 50: | |
| return (R_, G_, B_) | |
| elif 220 < R_ < 255 and 220 < G_ < 255 and 220 < B_ < 255: | |
| return (R_, G_, B_) | |
| else: | |
| sign = lambda x, y: random.choice([x,y]) | |
| R_ = RGB[2] + sign(+1,-1)*random.randint(1,10) | |
| G_ = RGB[1] + sign(+1,-1)*random.randint(1,10) | |
| B_ = RGB[0] + sign(+1,-1)*random.randint(1,10) | |
| R_ = 0 if R_ < 0 else (255 if R_ > 255 else R_) | |
| G_ = 0 if G_ < 0 else (255 if G_ > 255 else G_) | |
| B_ = 0 if B_ < 0 else (255 if B_ > 255 else B_) | |
| return (R_, G_, B_) | |
| def colorPicker(self): | |
| pixL.numOfSquaresFunc(self) | |
| for j in range(1,self.numOfSquaresH): | |
| for i in range(1,self.numOfSquaresW): | |
| self.pixValues.append((self.image.getpixel(( | |
| i * self.square - self.square//2, | |
| j * self.square - self.square//2)), | |
| (i * self.square - self.square//2, | |
| j * self.square - self.square//2))) | |
| self.background = 255 * np.ones(shape=[self.ImgH - self.square, | |
| self.ImgW - self.square*2, 3], | |
| dtype=np.uint8) | |
| def PEN(self,coorX,coorY,R,G,B): | |
| SQUARE = self.square | |
| cv2.rectangle(self.background, | |
| pt1=(coorX - SQUARE, coorY - SQUARE), #0, 0 -> 0, 0 | |
| pt2=(coorX, coorY), #6, 6 -> 3, 3 | |
| color=(pixL.optimizer((R,G,B))), | |
| thickness=-1) | |
| cv2.rectangle(self.background, | |
| pt1=(coorX, coorY - SQUARE), #0, 0 -> 3, 0 | |
| pt2=(coorX + SQUARE, coorY), #6, 6 -> 6, 3 | |
| color=(pixL.optimizer((R,G,B))), | |
| thickness=-1) | |
| cv2.rectangle(self.background, | |
| pt1=(coorX - SQUARE, coorY), #0, 0 -> 0, 3 | |
| pt2=(coorX, coorY + SQUARE), #6, 6 -> 3, 6 | |
| color=(pixL.optimizer((R,G,B))), | |
| thickness=-1) | |
| cv2.rectangle(self.background, | |
| pt1=(coorX, coorY), #0, 0 -> 3, 3 | |
| pt2=(coorX + SQUARE, coorY + SQUARE), #6, 6 -> 6, 6 | |
| color=(pixL.optimizer((R,G,B))), | |
| thickness=-1) | |
| def complier(self): | |
| for index, value in enumerate(self.pixValues): | |
| (R,G,B), (coorX, coorY) = value | |
| pixL.PEN(self,coorX,coorY,R,G,B) | |
| self.background = np.array(self.background).astype(np.uint8) | |
| self.background = cv2.resize(self.background, (self.ImgW,self.ImgH), interpolation = cv2.INTER_AREA) | |