import cv2 as cv import gradio as gr import numpy as np def change_image_color(img, option, color_from=None, color_to=None, tolerance=10): # HATA DÜZELTME 1: Gradio'dan gelen RGB görüntüyü OpenCV'nin anlayacağı BGR'ye çevir. img_bgr = cv.cvtColor(img, cv.COLOR_RGB2BGR) if option == "R <-> G (Kanal Değiştir)": # AÇIKLAMA: Bu işlem kırmızı ve yeşil kanallarını takas eder. b, g, r = cv.split(img_bgr) swapped_img = cv.merge([b, r, g]) # HATA DÜZELTME 4: Çıktıyı tekrar RGB'ye çevirerek Gradio'ya gönder. return cv.cvtColor(swapped_img, cv.COLOR_BGR2RGB) elif option == "R <-> B (Kanal Değiştir)": # AÇIKLAMA: Bu işlem kırmızı ve mavi kanallarını takas eder. b, g, r = cv.split(img_bgr) swapped_img = cv.merge([r, g, b]) return cv.cvtColor(swapped_img, cv.COLOR_BGR2RGB) elif option == "Gri Tonlamalı": gray_img = cv.cvtColor(img_bgr, cv.COLOR_BGR2GRAY) # Gri tonlamalı görüntü zaten tek kanal olduğu için Gradio'ya RGB olarak gönderilmelidir. return cv.cvtColor(gray_img, cv.COLOR_GRAY2RGB) elif option == "Özel Renk Dönüşümü" and color_from is not None and color_to is not None: # HATA DÜZELTME 2: Gelen Hex (RGB) renklerini BGR sırasına çevir. # Örnek: #FF0000 (Kırmızı) -> [255, 0, 0] (RGB) -> [0, 0, 255] (BGR) r_from, g_from, b_from = tuple(int(color_from.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)) color_from_bgr = np.array([b_from, g_from, r_from]) r_to, g_to, b_to = tuple(int(color_to.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)) color_to_bgr = [b_to, g_to, r_to] # HATA DÜZELTME 3: Renk tespiti için bir tolerans aralığı oluştur. # np.clip ile değerlerin 0-255 aralığında kalmasını sağlıyoruz. lower_bound = np.clip(color_from_bgr - tolerance, 0, 255) upper_bound = np.clip(color_from_bgr + tolerance, 0, 255) # Maske oluştur ve rengi değiştir mask = cv.inRange(img_bgr, lower_bound, upper_bound) img_bgr[mask != 0] = color_to_bgr return cv.cvtColor(img_bgr, cv.COLOR_BGR2RGB) # "Orijinal" veya geçersiz bir seçenek gelirse return cv.cvtColor(img_bgr, cv.COLOR_BGR2RGB) # Gradio arayüzü tanımla interface = gr.Interface( fn=change_image_color, inputs=[ gr.Image(type="numpy", label="Resim Yükleyin"), gr.Dropdown( ["Orijinal", "R <-> G (Kanal Değiştir)", "R <-> B (Kanal Değiştir)", "Gri Tonlamalı", "Özel Renk Dönüşümü"], label="Dönüşüm Seçin", value="Orijinal" # Başlangıç değeri ), gr.ColorPicker(label="Dönüştürülecek Renk (Kaynak)", value="#00FF00"), gr.ColorPicker(label="Yeni Renk (Hedef)", value="#FF0000"), gr.Slider(minimum=1, maximum=100, value=20, label="Renk Toleransı") ], outputs=gr.Image(type="numpy", label="Sonuç"), title="Görüntü Renk Dönüştürme Aracı", description="Bir dönüşüm seçin veya 'Özel Renk Dönüşümü' ile belirli bir rengi tolerans dahilinde başka bir renge dönüştürün." ) interface.launch()