WildGenie's picture
Create app.py
f418dae verified
import cv2
import numpy as np
import gradio as gr
from skimage.filters import threshold_sauvola
from skimage.morphology import opening, closing, disk
def preprocess_image(image):
"""
Görüntüyü gri tonlamaya dönüştürür ve gürültüyü azaltmak için
Gauss bulanıklığı uygular.
Args:
image: İşlenecek renkli görüntü.
Returns:
Gri tonlamalı ve bulanıklaştırılmış görüntü.
"""
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
return blur
def sauvola_thresholding(image):
"""
Görüntüye Sauvola eşikleme algoritmasını [1] uygular ve
negatifini alır.
Args:
image: Eşiklenecek gri tonlamalı görüntü.
Returns:
Eşiklenmiş ikili görüntü.
Referanslar:
[1] Sauvola, J., and Pietikäinen, M. (2000). Adaptive document image
binarization. Pattern recognition, 33(2), 225-236.
"""
thresh_sauvola = threshold_sauvola(image, window_size=25)
binary_sauvola = image > thresh_sauvola
binary_sauvola = np.invert(binary_sauvola)
return (binary_sauvola.astype(np.uint8) * 255).astype(np.uint8)
def morphological_operations(image):
"""
Görüntüye morfolojik açma ve kapama işlemlerini [2] uygular.
Args:
image: İşlenecek ikili görüntü.
Returns:
Açma ve kapama işlemleri uygulanmış görüntü.
Referanslar:
[2] Gonzalez, R. C., Woods, R. E., and Eddins, S. L. (2004). Digital
image processing using MATLAB. Pearson Education India.
"""
selem = disk(2) # Yapılandırıcı eleman
opened = opening(image, selem)
closed = closing(opened, selem)
return closed
def detect_defect(image, area_threshold=50):
"""
Kaynak dikişindeki kusurları tespit etmek için kontur analizi [3]
kullanır ve kontur alanına göre filtreleme yapar.
Args:
image: Kusur tespiti yapılacak ikili görüntü.
area_threshold: Kusur olarak kabul edilecek minimum kontur alanı.
Returns:
Kusur tespit sonucu ("Kusur tespit edildi" veya "Kusur tespit edilmedi")
ve tespit edilen kusurların konturları (varsa).
Referanslar:
[3] Suzuki, S. (1985). Topological structural analysis of digitized
binary images by border following. Computer vision, graphics, and
image processing, 30(1), 32-46.
"""
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
defects = [cnt for cnt in contours if cv2.contourArea(cnt) > area_threshold]
if len(defects) > 0:
return "Kusur tespit edildi", defects
return "Kusur tespit edilmedi", None
def threshold_yenileri(image, threshold_method="sauvola"):
"""
Farklı eşikleme yöntemlerini uygular.
Args:
image: Eşiklenecek gri tonlamalı görüntü.
threshold_method: Kullanılacak eşikleme yöntemi ("sauvola", "adaptive" veya "sauvola_adaptive").
Returns:
Eşiklenmiş ikili görüntü.
"""
if threshold_method == "sauvola":
return sauvola_thresholding(image)
elif threshold_method == "adaptive":
thresholded = cv2.adaptiveThreshold(
image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
return cv2.bitwise_not(thresholded)
elif threshold_method == "sauvola_adaptive":
# Sauvola ile eşikleme yap
sauvola_thresh = sauvola_thresholding(image)
# Adaptive eşikleme yap ve tersini al
adaptive_thresh = cv2.adaptiveThreshold(
image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
adaptive_thresh = cv2.bitwise_not(adaptive_thresh)
# İki sonucu birleştir (mantıksal VEYA işlemi)
combined_thresh = cv2.bitwise_or(sauvola_thresh, adaptive_thresh)
return combined_thresh
else:
raise ValueError("Geçersiz eşikleme yöntemi.")
def predict(image, area_threshold=50, threshold_method="sauvola"):
"""
Verilen görüntünün kaynak dikişindeki kusurları tahmin eder.
Args:
image: İşlenecek kaynak görüntüsü.
area_threshold: Kusur olarak kabul edilecek minimum kontur alanı.
threshold_method: Kullanılacak eşikleme yöntemi ("sauvola", "adaptive" veya "sauvola_adaptive").
Returns:
İşlem çıktıları (gri tonlamalı, eşiklenmiş, bölümlenmiş ve kusurlar
vurgulanmış görüntüler) ve kusur tespit sonucu.
"""
processed_image = preprocess_image(image)
thresholded_image = threshold_yenileri(processed_image, threshold_method)
segmented_image = morphological_operations(thresholded_image)
result, defects = detect_defect(segmented_image, area_threshold)
if defects is not None:
for defect in defects:
cv2.drawContours(image, [defect], -1, (0, 0, 255), 2)
image_outputs = [
(processed_image, "Gri Tonlamalı Görüntü"),
(thresholded_image, "Eşiklenmiş Görüntü"),
(segmented_image, "Açma ve Kapama ile Bölümlenmiş Görüntü"),
(image, "Kusurlar Vurgulanmış Görüntü"),
]
return image_outputs, result
# Gradio arayüzü
demo = gr.Interface(
fn=predict,
inputs=[
gr.Image(type="numpy"),
gr.Slider(
minimum=10,
maximum=500,
value=50,
step=10,
label="Kontur Alan Eşiği",
),
gr.Dropdown(
choices=["sauvola", "adaptive", "sauvola_adaptive"],
value="sauvola",
label="Eşikleme Yöntemi",
),
],
outputs=[
gr.Gallery(
label="İşlem Çıktıları",
show_label=True,
elem_id="gallery",
columns=[1],
object_fit="contain",
height="auto",
),
gr.Textbox(label="Sonuç"),
],
examples=[
["W0001_0000.png", 50, "sauvola"],
["W0001_0001.png", 100, "adaptive"],
["W0001_0002.png", 75, "sauvola_adaptive"],
],
title="Kaynak Kusur Tespit Uygulaması",
description="Bir kaynak görüntüsü yükleyin ve kusur olup olmadığını kontrol edin.",
)
if __name__ == "__main__":
demo.launch()