Обнаружение перекрещивающихся прямоугольников OpenCV - PullRequest
0 голосов
/ 18 декабря 2018

В моем проекте я пытаюсь оценить измельченность соломы.До того, как попробовать какую-либо CNN-технологию, я очень хотел знать, насколько далеко зашёл OpenCV-подход.Вот как может выглядеть такая картинка: На этой картинке показаны похожие кадры, которые я нашел в Интернете, поскольку используемые мной изображения являются собственностью компании

Пока что у меня естьПоигрался с разными имидж-операторами и разными настройками.Благодаря некоторым сообщениям о переполнении стека, я пытался предварительно обработать свои изображения перед обнаружением контура с помощью комбинаций размытия, настройки контрастности и гаммы, изменения резкости, порогового значения, оператора canny, расширения и эрозии ... Пока я игралвокруг переключения операторов, изменения их порядка и параметров и получения рабочего процесса, который приводит к следующему до и после результата:

до обработки после обработки

Кодирование-извлечение по процессу предварительной обработки:

    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ContourDetection_Variant.show_image(image, "Grayscaled", image_label)

    image = cv2.medianBlur(image, 5)
    ContourDetection_Variant.show_image(image, "Median Filtered Image", image_label)

    # Adjust the brightness and contrast of the picture, alpha is contrast & beta is brightness.
    alpha = 3  # Simple contrast control, 1.0 is status quo (alpha value [1.0-3.0])
    beta = -100  # Simple brightness control, 0 i status quo (beta value [0-100])
    image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
    ContourDetection_Variant.show_image(image, "Contrast & Brightness adjustment", image_label)

    # Sharping method 2: Applying scharpening kernel filter
    # https://medium.com/@almutawakel.ali/opencv-filters-arithmetic-operations-2f4ff236d6aa
    # Create our shapening kernel, it must equal to one eventually
    # kernel_sharpening = np.array([[-1.4142, -1, -1.4142],
    #                               [-1, 10.6569, -1],
    #                               [-1.4142, -1, -1.4142]])
    kernel_sharpening = np.array([[-2.8284, -2.2361, -2, -2.2361, -2.8284],
                                  [-2.2361, -1.4142, -1, -1.4142, -2.2361],
                                  [-2, -1, 47.8591, -1, -2],
                                  [-2.2361, -1.4142, -1, -1.4142, -2.2361],
                                  [-2.8284, -2.2361, -2, -2.2361, -2.8284]])
    # applying the sharpening kernel to the input image & displaying it.
    image = cv2.filter2D(image, -1, kernel_sharpening)
    ContourDetection_Variant.show_image(image, "Sharpening method by designing own kernel", image_label)

    # Added bordertype REFLECT_101, which extends the image at the borders with pixels within the image in inverse
    # order.
    image = cv2.GaussianBlur(image, (3, 3), cv2.BORDER_REFLECT_101)
    ContourDetection_Variant.show_image(image, "Gaussian Blur", image_label)

    retval, image = cv2.threshold(image, 45, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    ContourDetection_Variant.show_image(image, "Thresholded", image_label)

    image = cv2.erode(image, None, iterations=1)
    ContourDetection_Variant.show_image(image, "Erode applied", image_label)

    image = cv2.medianBlur(image, 3)
    ContourDetection_Variant.show_image(image, "Median Filtered Image", image_label)

    retval, image = cv2.threshold(image, 45, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    ContourDetection_Variant.show_image(image, "Thresholded", image_label)

(далее идет передача полученного изображения в findContours of OpenCV)

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

Мой вопрос довольно общий, позволит ли OpenCV предлагать более многообещающие методы (помимо поиска контуров)достичь своей цели?

...