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