Bugün sizlerle, Python kullanarak oluşturduğum ve YouTube kanalımda yayınladığım o hipnotik “Julia Kümesi” videosunun mutfağına gireceğiz. Ama korkmayın! Karmaşık matematik formülleri veya sıkıcı denklemler yok. Bunun yerine piksellerin oynadığı basit bir “kaçış oyunu”ndan bahsedeceğiz.
Hazırsanız, Python ve OpenCV kütüphanelerini kullanarak kendi dijital sanatımızı üretelim.
Olayın Mantığı: Piksellerin “Kaçış Oyunu”
Ekranda gördüğünüz o karmaşık ve büyüleyici desenler, aslında bilgisayarın her bir piksel (nokta) için oynadığı basit bir oyundan ibaret.
Bu fraktalın (Julia Kümesi) mantığını şöyle hayal edin:
- Oyun Sahası: Ekranınızdaki her piksel bir oyuncu.
- Kural: Her oyuncuya (piksele) bir sayısal görev veriyoruz. Sonra çıkan sonucu alıp tekrar aynı işleme sokuyoruz. Buna “Geri Besleme” (Feedback Loop) deniyor. Tıpkı mikrofonu hoparlöre yaklaştırdığınızda oluşan o sonsuz döngü sesi gibi.
- Sonuç: Bazı pikseller bu işlem sırasında sabit kalıyor, yerinden kımıldamıyor (bunları siyah/koyu renk yapıyoruz). Bazıları ise hızla büyüyüp merkezden kaçıyor (bunları parlak renklerle boyuyoruz).
Peki neden hareket ediyor?
Videoda gördüğünüz o “nefes alma” etkisi ise oyunun kuralını (sihirli bir sayıyı) her karede çok az değiştirmemizden kaynaklanıyor. Kural milim değişince, piksellerin kaderi de değişiyor ve ortaya o akışkan görüntü çıkıyor.
Neden OpenCV Kullanıyoruz?
Genelde Python ile grafik çizerken Matplotlib kullanılır. Ancak biz video yapmak istiyoruz. Matplotlib video oluştururken biraz yavaş kalabilir. Bu projede OpenCV kütüphanesini seçtim çünkü:
- Görüntüleri çok daha hızlı işler.
- Doğrudan
.mp4video dosyası oluşturabilir. - Görüntü işleme dünyasının “İsviçre Çakısı”dır.
Python Kodu
Bu projeyi kendi bilgisayarınızda çalıştırmak için terminale şu komutu yazarak gerekli kütüphaneleri kurun:
pip install opencv-python numpy
İşte o “Sonsuz Döngü” videosunu oluşturan kodlar:
import cv2
import numpy as np
# --- YÜKSEK KALİTE AYARLARI ---
# YouTube'un sevdiği çözünürlük (1080p Full HD)
width, height = 1080, 1920
# Akıcılık için 60 FPS
fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "julia_hd_60fps.mp4"
# Codec Ayarı:
# Windows'ta bazen 'avc1' çalışmayabilir, hata alırsan burayı tekrar 'mp4v' yap.
try:
fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(filename, fourcc, fps, (width, height))
# --- KOORDİNAT SİSTEMİ ---
x = np.linspace(-1.5, 1.5, width)
aspect_ratio = height / width
y = np.linspace(-1.5 * aspect_ratio, 1.5 * aspect_ratio, height)
X, Y = np.meshgrid(x, y)
Z_base = X + 1j * Y
print(f"Video oluşturuluyor: {filename}")
print(f"Çözünürlük: {width}x{height} | FPS: {fps}")
print("Bu işlem yüksek kalite nedeniyle biraz uzun sürebilir...")
# --- ANİMASYON DÖNGÜSÜ ---
for i in range(total_frames):
if i % 50 == 0:
print(f"İşleniyor: %{int(i/total_frames*100)}")
angle = 2 * np.pi * i / total_frames
c = 0.7885 * np.exp(1j * angle)
Z = Z_base.copy()
img_data = np.zeros(Z.shape, dtype=float)
max_iter = 50
for _ in range(max_iter):
mask = np.abs(Z) <= 10
Z[mask] = Z[mask]**2 + c
img_data[mask] += 1
# Renklendirme
img_norm = np.log(img_data + 1) / np.log(max_iter) * 255
img_uint8 = img_norm.astype(np.uint8)
# MAGMA renk haritası
colored_frame = cv2.applyColorMap(img_uint8, cv2.COLORMAP_MAGMA)
out.write(colored_frame)
out.release()
print("Yüksek kaliteli video hazır!")
Kodun Kısa Özeti
numpy: Tüm ekranı tek tek piksellerle uğraşmak yerine dev bir ızgara (grid) gibi yönetmemizi sağlar. İşlemi hızlandıran kahramanımız budur.fordöngüsü: Videonun her bir karesini tek tek çizer.cv2.applyColorMap: Sayısal verileri (hangi piksel kaç puan aldı) insan gözüne hoş gelen renklere dönüştürür.