File size: 3,234 Bytes
7976dbf
 
 
 
5a9fb83
 
 
7976dbf
5a9fb83
 
7976dbf
5a9fb83
 
 
 
 
 
7976dbf
5a9fb83
 
 
7976dbf
 
5a9fb83
7976dbf
5a9fb83
7976dbf
5a9fb83
 
 
 
 
 
 
 
 
 
 
 
 
 
7976dbf
 
5a9fb83
 
 
 
 
 
7976dbf
 
 
 
 
 
5a9fb83
 
 
 
 
 
 
 
7976dbf
5a9fb83
 
 
7976dbf
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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()