| 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) |
| 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_thresh = sauvola_thresholding(image) |
| |
| adaptive_thresh = cv2.adaptiveThreshold( |
| image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 |
| ) |
| adaptive_thresh = cv2.bitwise_not(adaptive_thresh) |
| |
| 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 |
|
|
| |
| 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() |
|
|