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()