Лучшее соотношение цены и качества в Канни

У меня есть изображение, на котором я хочу обнаружить края. Я обнаружил, что Canny часто используется (не знаю, есть ли у меня лучший вариант). Я установил следующие значения:

  Imgproc.Canny(img, img, 10, 100, 3,true)

Я изменил пороговые значения, но не вижу особых изменений в моем изображении. Может ли кто-нибудь объяснить мне, есть ли логический способ вычислить числа для пороговых значений (мое изображение - серая шкала)

Спасибо...


person Rubbic    schedule 04.08.2014    source источник
comment
вы можете использовать пороговое значение OTSU для вычисления оптимального порога и изменять его для низкого и высокого порога.   -  person Micka    schedule 05.08.2014


Ответы (3)


Я думаю, что это следует рассматривать в каждом конкретном случае, если вы разместите несколько образцов изображений, это будет полезно, но я все равно постараюсь ответить. Вот из документов Opencv

Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
where the arguments are:

detected_edges: Source image, grayscale
detected_edges: Output of the detector (can be the same as the input)
lowThreshold: The value entered by the user moving the Trackbar
highThreshold: Set in the program as three times the lower threshold (following Canny’s recommendation)
kernel_size: We defined it to be 3 (the size of the Sobel kernel to be used internally)

У меня обычно работает highThreshold = 255 and lowThreshold = 255/3

person Samer    schedule 04.08.2014
comment
Большое спасибо. У меня быстрый вопрос, поэтому после Canny я расширяю и размываю, как мне избавиться от случайных белых точек на изображении? - person Rubbic; 04.08.2014
comment
Существует множество алгоритмов сглаживания, которые вы можете использовать, проверьте - person Samer; 04.08.2014
comment
Разве 255 не является максимальным значением цветового градиента для пикселя? - person NeoWang; 18.03.2017

Как сказал Самер, это может быть в каждом конкретном случае. Вот код, который использует трекбары в opencv и отображает хитроумное изображение рядом с оригиналом, чтобы быстро поэкспериментировать с разными пороговыми значениями.

import cv2
import numpy as np 
import matplotlib.pyplot as plt 

def callback(x):
    print(x)

img = cv2.imread('your_image.png', 0) #read image as grayscale


canny = cv2.Canny(img, 85, 255) 

cv2.namedWindow('image') # make a window with name 'image'
cv2.createTrackbar('L', 'image', 0, 255, callback) #lower threshold trackbar for window 'image
cv2.createTrackbar('U', 'image', 0, 255, callback) #upper threshold trackbar for window 'image

while(1):
    numpy_horizontal_concat = np.concatenate((img, canny), axis=1) # to display image side by side
    cv2.imshow('image', numpy_horizontal_concat)
    k = cv2.waitKey(1) & 0xFF
    if k == 27: #escape key
        break
    l = cv2.getTrackbarPos('L', 'image')
    u = cv2.getTrackbarPos('U', 'image')

    canny = cv2.Canny(img, l, u)

cv2.destroyAllWindows()
person Matthew Thomas    schedule 19.05.2020

Вы можете использовать это уравнение, оно полезно, и вы можете применить более синий цвет, чтобы улучшить его.

blurred_img = cv2.blur(img,ksize=(5,5))
med_val = np.median(img) 
lower = int(max(0 ,0.7*median_pix))
upper = int(min(255,1.3*median_pix))
edges = cv2.Canny(image=img, threshold1=lower,threshold2=upper)
person Abdulelah Alkesaiberi    schedule 12.07.2020