Skip to content

TayfunBasoglu/Color-Palette-From-Movie

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 

Repository files navigation

Color palette from movie

Verilen bir görüntüde kullanılan renk paletini bulabilmek amaçlandı. Bunun için OpenCV ve Sklearn KNN kullanıldı.

Uygulamayı Google Colab üzerinden yaptım. Bu yüzden cv2_imshow kullanılıyor. Masaüstü uygulamasında cv içerisinden imkey ve imshow kullanılmalı.

Gerekli kütüphaneler

import cv2 as cv
from skimage import io
from google.colab.patches import cv2_imshow
import numpy as np
from sklearn.cluster import KMeans

İlk olarak bir görseli almamız gerekiyor. Ben linkler üzerinden de okuma yaptırmak istediğim için skimage kullanıyorum.

image = io.imread("https://www.themoviedb.org/t/p/original/bKCKP0j7Ua9qceKH0TEXRDQ3EVs.jpg")

Eğer bir görseli okurken 404 hatası veriyorsa sitenin okunmasında engel ile karşılaşmıştır. Görseli okutmak için farklı yöntemler denenebilir.

OpenCV görselleri BGR olarak istiyor. Skimage ise RGB olarak okuyor. Bu yüzden gelen görseli boyutlarından çevirmemiz gerekiyor. Opencv içerisinde fonksiyon var fakat genel liste kuralı ile ters çevirebiliriz.

image = io.imread("https://www.themoviedb.org/t/p/original/bKCKP0j7Ua9qceKH0TEXRDQ3EVs.jpg")[:,:,::-1]

K-Nearest Neighbors(KNN) modelini kurmamız gerekiyor. Burada kaç adet küme arayacağını belirlemeliyiz. Bu kümelerin merkezleri bizim renk paletimizdeki renkleri verecek. 10 adet renk yeterli olacaktır. Bunun için 10 adet küme araması yapacak.

#KNN Model
n_clusters = 10
model = KMeans(n_clusters=n_clusters,random_state=1).fit(image.reshape(-1,3))

Şimdi her bir renk kutusunun genişliğini ve yüksekliğini belirliyoruz.

#Each Color-box Size
height = 100
width = 100

Renk kutularını oluşturmamız gerekiyor. Bunun için KNN ile belirlenmiş olan küme merkezlerinin içerisinde geziyoruz. Ardından genişliğini, yüksekliğini ve boyutunu belirttiğimiz bir Numpy alanını bu kümenin merkezi ile dolduruyoruz. Böylece küme merkezi değeri verilen alanı doldurana kadar tekrar edilecek ve görselimiz oluşacak. Sonrasında renklerin daha iyi görülmesi için kenarlarına siyah çerçeve ekliyoruz. İşlemlerin ardından oluşan her bir “sonuç” renk yapısını kümeye ekliyoruz.

#Create Color Boxes
color_palette = []
for i in model.cluster_centers_: 
  img = np.full((height, width, 3), i, np.uint8)   #create color box and fill with center
  img = cv.copyMakeBorder(img,5,5,2,2,cv.BORDER_CONSTANT,value=[0,0,0])   #add black border
  color_palette.append(img)

Oluşturulan renk kutularını yan yana tek bir görselde birleştiriyoruz. İlk ve son değerin kenarlıkları yeterli olmayacak çünkü iç değerler sağdan soldan tekrar etti ve daha kalın oldular. Bu yüzden son olarak onlara biraz kenarlık ekliyoruz.

#Create Color Palette
palette = color_palette[0]
for i in color_palette[1:]:
  palette = np.concatenate((palette,i),axis=1)
palette = cv.copyMakeBorder(palette,0,0,3,3,cv.BORDER_CONSTANT,value=[0,0,0])

Artık işlemler bitti. Görselimizi ve paleti ekrana veriyoruz.

#Show
cv2_imshow(image)
cv2_imshow(palette)

Releases

No releases published

Packages

No packages published

Languages