Обнаружение края для нескольких изображений - PullRequest
2 голосов
/ 10 октября 2019

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

Я прочитал несколько изображений в оттенках серого, и теперь я хочу сделать обнаружение края для всех изображений. Как выбрать параметры максимального и минимального значения для функции Canny. Изображения могут быть доступны здесь

import glob
import cv2

images = [cv2.imread(file,0) for file in glob.glob("images/*.jpg")]
edges = cv2.Canny(images,100,200)

1 Ответ

0 голосов
/ 10 октября 2019

Чтобы автоматически выбрать максимальное и минимальное значения для cv2.Canny(), вы можете использовать функцию auto_canny(), созданную Адрианом Роузброком в своем блоге Нулевой параметр, автоматическое обнаружение Canny edge с помощью Python и OpenCV . Идея состоит в том, чтобы вычислить медиану интенсивности пикселей в изображении, а затем принять это медианное значение для определения порогов lower и upper. Для более подробного объяснения загляните в его блог. Вот функция

def auto_canny(image, sigma=0.33):
    # Compute the median of the single channel pixel intensities
    v = np.median(image)

    # Apply automatic Canny edge detection using the computed median
    lower = int(max(0, (1.0 - sigma) * v))
    upper = int(min(255, (1.0 + sigma) * v))
    return cv2.Canny(image, lower, upper)

Чтобы выполнить обнаружение края на нескольких изображениях, вы можете использовать библиотеку glob, чтобы перебирать каждое изображение, применять обнаружение четкого края, а затем сохранять изображение. Вот результаты

enter image description here

import cv2
import numpy as np
import glob

def auto_canny(image, sigma=0.33):
    # Compute the median of the single channel pixel intensities
    v = np.median(image)

    # Apply automatic Canny edge detection using the computed median
    lower = int(max(0, (1.0 - sigma) * v))
    upper = int(min(255, (1.0 + sigma) * v))
    return cv2.Canny(image, lower, upper)

# Read in each image and convert to grayscale
images = [cv2.imread(file,0) for file in glob.glob("images/*.jpg")]

# Iterate through each image, perform edge detection, and save image
number = 0
for image in images:
    canny = auto_canny(image)
    cv2.imwrite('canny_{}.png'.format(number), canny)
    number += 1
...