zaferturan's picture
Update app.py
2488c8f verified
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()