File size: 5,454 Bytes
a774766
 
 
1d35511
a774766
7a9f1f3
 
 
 
 
 
a774766
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a44adb4
d72365f
6d27430
1d35511
7a9f1f3
 
 
 
d72365f
 
 
 
7a9f1f3
d72365f
 
7a9f1f3
d72365f
 
 
 
 
 
 
7a9f1f3
d72365f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a9f1f3
1d35511
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d27430
646df2f
a774766
 
 
7a9f1f3
a44adb4
c03c703
a774766
 
 
 
a44adb4
6d27430
a774766
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import cv2
import numpy as np
import gradio as gr
import matplotlib.pyplot as plt

color_ranges = [
    ([100, 150, 0], [140, 255, 255]),  # Blue range
    ([35, 100, 100], [85, 255, 255])   # Green range
]


# Farklı filtre fonksiyonları
def apply_gaussian_blur(frame):
    return cv2.GaussianBlur(frame, (15, 15), 0)

def apply_sharpening_filter(frame):
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
    return cv2.filter2D(frame, -1, kernel)

def apply_edge_detection(frame):
    return cv2.Canny(frame, 100, 200)

def apply_invert_filter(frame):
    return cv2.bitwise_not(frame)

def adjust_brightness_contrast(frame, alpha=1.0, beta=50):
    return cv2.convertScaleAbs(frame, alpha=alpha, beta=beta)

def apply_grayscale_filter(frame):
    return cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

def apply_sepia_filter(frame):
    sepia_filter = np.array([[0.272, 0.534, 0.131],
                             [0.349, 0.686, 0.168],
                             [0.393, 0.769, 0.189]])
    return cv2.transform(frame, sepia_filter)

def apply_fall_filter(frame):
    fall_filter = np.array([[0.393, 0.769, 0.189],
                            [0.349, 0.686, 0.168],
                            [0.272, 0.534, 0.131]])
    return cv2.transform(frame, fall_filter)

# Filtre uygulama fonksiyonu
def apply_filter(filter_type, input_image=None):
    if input_image is not None:
        frame = input_image
    else:
        cap = cv2.VideoCapture(0)
        ret, frame = cap.read()
        cap.release()
        if not ret:
            return "Web kameradan görüntü alınamadı"

    if filter_type == "Gaussian Blur":
        return apply_gaussian_blur(frame)
    elif filter_type == "Sharpen":
        return apply_sharpening_filter(frame)
    elif filter_type == "Edge Detection":
        return apply_edge_detection(frame)
    elif filter_type == "Invert":
        return apply_invert_filter(frame)
    elif filter_type == "Brightness":
        return adjust_brightness_contrast(frame, alpha=1.0, beta=50)
    elif filter_type == "Grayscale":
        return apply_grayscale_filter(frame)
    elif filter_type == "Sepia":
        return apply_sepia_filter(frame)
    elif filter_type == "Sonbahar":
        return apply_fall_filter(frame)
    elif filter_type == "Random Colorful Dots":
        return apply_porcelain_splatter_effect(frame)
    elif filter_type == "Picasso":
        return split_and_shuffle_image(frame)




def apply_porcelain_splatter_effect(image):
    # Assume 'image' is an RGB NumPy array
    # Get image dimensions
    height, width, _ = image.shape

    # Create a blank layer for the porcelain splatter effect
    splatter_layer = np.zeros((height, width, 3), dtype=np.uint8)

    # Define colors for splatter pattern
    colors = [
        (255, 140, 0),   # orange
        (0, 128, 0),     # green
        (0, 0, 255),     # red
        (70, 130, 180)   # matte blue
    ]

    # Add random splatter patterns
    for _ in range(1000):
        # Random position for splatter
        x, y = np.random.randint(0, width), np.random.randint(0, height)
        # Random color from defined palette
        color = colors[np.random.randint(0, len(colors))]
        # Random radius for splatter
        radius = np.random.randint(1, 10)
        # Draw a small circle on the splatter layer
        cv2.circle(splatter_layer, (x, y), radius, color, -1)

    # Blend the splatter layer with the original image to get the porcelain effect
    alpha = 0.4  # transparency for splatter layer
    porcelain_image = cv2.addWeighted(image, 1 - alpha, splatter_layer, alpha, 0)

    return porcelain_image

def split_and_shuffle_image(image):
    # Determine the height and width of each piece
    h, w, _ = image.shape
    h_split, w_split = h // 3, w // 3
    
    # Split the image into 9 pieces
    pieces = []
    for i in range(3):
        for j in range(3):
            piece = image[i * h_split:(i + 1) * h_split, j * w_split:(j + 1) * w_split]
            pieces.append(piece)
    
    # Shuffle the pieces
    np.random.shuffle(pieces)
    
    # Reconstruct the shuffled image
    shuffled_image = np.zeros_like(image)
    idx = 0
    for i in range(3):
        for j in range(3):
            shuffled_image[i * h_split:(i + 1) * h_split, j * w_split:(j + 1) * w_split] = pieces[idx]
            idx += 1
            
    return shuffled_image

    

     

# Gradio arayüzü
with gr.Blocks() as demo:
    gr.Markdown("# Image Proccessing Exercise 01 - Tech Istanbul")
    gr.Markdown("# I would like to thank to Murat hoca & Tech Istanbul for teaching us image processing ")
    gr.Markdown("# I added 'Picasso' and 'Random Colorful Dots' filters to the options. They are at the top ")

    # Filtre seçenekleri
    filter_type = gr.Dropdown(
        label="Filtre Seçin",
        choices=["Picasso","Random Colorful Dots","Gaussian Blur", "Sharpen", "Edge Detection", "Invert", "Brightness", "Grayscale", "Sepia", "Sonbahar"],
        value="Picasso"
    )

    # Görüntü yükleme alanı
    input_image = gr.Image(label="Resim Yükle", type="numpy")

    # Çıktı için görüntü
    output_image = gr.Image(label="Filtre Uygulandı")

    # Filtre uygula butonu
    apply_button = gr.Button("Filtreyi Uygula")

    # Butona tıklanınca filtre uygulama fonksiyonu
    apply_button.click(fn=apply_filter, inputs=[filter_type, input_image], outputs=output_image)

# Gradio arayüzünü başlat
demo.launch()