Spaces:
Sleeping
Sleeping
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() |