File size: 8,944 Bytes
879f916
64caca7
879f916
64caca7
879f916
 
 
64caca7
879f916
 
 
64caca7
879f916
 
64caca7
879f916
 
64caca7
879f916
 
64caca7
879f916
 
64caca7
879f916
 
 
 
 
64caca7
879f916
 
64caca7
879f916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64caca7
879f916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64caca7
879f916
 
793d19b
879f916
 
 
 
 
 
 
 
 
 
 
 
2488c8f
879f916
 
2488c8f
879f916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64caca7
879f916
 
 
64caca7
879f916
 
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
import cv2
import numpy as np
import gradio as gr

# 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_bilateral_filter(frame):
    return cv2.bilateralFilter(frame, 9, 75, 75)

def apply_darkening_filter(frame, alpha=0.5):
    return cv2.convertScaleAbs(frame, alpha=alpha, beta=0)

def apply_histogram_equalization(frame):
    if len(frame.shape) == 2:  # Grayscale
        return cv2.equalizeHist(frame)
    else:
        ycrcb = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)
        channels = cv2.split(ycrcb)
        cv2.equalizeHist(channels[0], channels[0])
        ycrcb = cv2.merge(channels)  # Burada düzeltme yapıldı
        return cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)

def apply_median_blur(frame):
    return cv2.medianBlur(frame, 15)

def apply_dilation(frame, kernel_size=5):
    kernel = np.ones((kernel_size, kernel_size), np.uint8)
    return cv2.dilate(frame, kernel, iterations=1)

def apply_erosion(frame, kernel_size=5):
    kernel = np.ones((kernel_size, kernel_size), np.uint8)
    return cv2.erode(frame, kernel, iterations=1)

def apply_line_detection(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
    if lines is not None:
        for rho, theta in lines[:,0]:
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a * rho
            y0 = b * rho
            x1 = int(x0 + 1000 * (-b))
            x2 = int(x0 - 1000 * (-b))
            y1 = int(y0 + 1000 * (a))
            y2 = int(y0 - 1000 * (a))
            cv2.line(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
    return frame

def apply_contour_detection(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edged = cv2.Canny(blurred, 50, 150)
    contours, _ = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)
    return frame

def apply_box_blur(frame):
    return cv2.blur(frame, (15, 15))

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

def apply_sobel_edge_detection(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
    sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)
    sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
    return cv2.convertScaleAbs(sobel)

def apply_thresholding(frame, threshold_value=127):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY)
    return thresh

def apply_color_quantization(frame, k=8):
    Z = frame.reshape((-1, 3))
    Z = np.float32(Z)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    _, label, center = cv2.kmeans(Z, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    res = center[label.flatten()]
    return res.reshape((frame.shape))

# Filtre açıklamaları
filter_descriptions = {
    "Gaussian Blur": "Resmi bulanıklaştırır. Bu filtre, resimdeki gürültüyü azaltmak için kullanılır.",
    "Sharpen": "Resmi netleştirir. Bu filtre, resimdeki kenarları daha belirgin hale getirir.",
    "Edge Detection": "Canny Edge Detection algoritmasını kullanarak resimdeki kenarları tespit eder.",
    "Invert": "Resmin renklerini tersine çevirir.",
    "Brightness": "Resmin parlaklığını ve kontrastını ayarlar.",
    "Grayscale": "Resmi gri tonlamalı hale getirir.",
    "Sepia": "Resmi sepiya tonlarıyla işler.",
    "Bilateral": "Kenar koruyarak resmi bulanıklaştırır.",
    "Darkening": "Resmi karartır.",
    "Histogram Equalization": "Resmin histogramını eşitleyerek kontrastı artırır.",
    "Median Blur": "Medyan filtresi ile resmi bulanıklaştırır. Bu filtre, gürültüyü azaltmak için kullanılır.",
    "Dilation": "Resimdeki beyaz bölgeleri genişletir.",
    "Erosion": "Resimdeki beyaz bölgeleri daraltır.",
    "Line Detection": "Hough dönüşümü ile resimdeki doğruları tespit eder.",
    "Contour Detection": "Resimdeki konturları tespit eder ve çizer.",
    "Box Blur": "Basit bir bulanıklaştırma filtresi.",
    "Emboss": "Resmi kabartma efektiyle işler.",
    "Sobel Edge Detection": "Sobel operatörü ile kenarları tespit eder.",
    "Thresholding": "Eşikleme ile resmi ikili (siyah-beyaz) hale getirir.",
    "Color Quantization": "Renk sayısını azaltarak resmi daha basit bir renk paletiyle gösterir."
}

# 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 == "Bilateral":
        return apply_bilateral_filter(frame)
    elif filter_type == "Darkening":
        return apply_darkening_filter(frame)
    elif filter_type == "Histogram Equalization":
        return apply_histogram_equalization(frame)
    elif filter_type == "Median Blur":
        return apply_median_blur(frame)
    elif filter_type == "Dilation":
        return apply_dilation(frame)
    elif filter_type == "Erosion":
        return apply_erosion(frame)
    elif filter_type == "Line Detection":
        return apply_line_detection(frame)
    elif filter_type == "Contour Detection":
        return apply_contour_detection(frame)
    elif filter_type == "Box Blur":
        return apply_box_blur(frame)
    elif filter_type == "Emboss":
        return apply_emboss_filter(frame)
    elif filter_type == "Sobel Edge Detection":
        return apply_sobel_edge_detection(frame)
    elif filter_type == "Thresholding":
        return apply_thresholding(frame)
    elif filter_type == "Color Quantization":
        return apply_color_quantization(frame)

# Gradio arayüzü
with gr.Blocks() as demo:
    gr.Markdown("# Web Kameradan ya da Yüklenen Fotoğraftan Canlı Filtreleme")
    
    # Filtre seçenekleri
    filter_type = gr.Dropdown(
        label="Filtre Seçin",
        choices=list(filter_descriptions.keys()),
        value="Gaussian Blur"
    )
    
    # Filtre açıklaması
    filter_description = gr.Markdown(label="Filtre Açıklaması", value=filter_descriptions["Gaussian Blur"])
    
    # Görüntü yükleme alanı
    input_image = gr.Image(label="Resim Yükle", type="numpy", height=300, width=300)
    
    # Çıktı için görüntü
    output_image = gr.Image(label="Filtre Uygulandı", height=300, width=300)
    
    # Giriş ve çıkış resimlerini yan yana gösterme
    with gr.Row():
        with gr.Column(scale=1):
            gr.Markdown("### Giriş Resmi")
            input_image
        with gr.Column(scale=1):
            gr.Markdown("### Çıkış Resmi")
            output_image
    
    # Filtre seçildiğinde açıklamayı güncelleme
    def update_description(filter_type):
        return filter_descriptions[filter_type]
    
    filter_type.change(fn=update_description, inputs=filter_type, outputs=filter_description)
    
    # Resim yüklendiğinde veya filtre değiştirildiğinde otomatik olarak filtre uygulama
    input_image.change(fn=apply_filter, inputs=[filter_type, input_image], outputs=output_image)
    filter_type.change(fn=apply_filter, inputs=[filter_type, input_image], outputs=output_image)

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