Измерение вертикального расстояния бинаризованного изображения (Open CV) C++

Так что это должно быть прямолинейно, но я не очень хорошо знаком с OpenCV.

Может ли кто-нибудь предложить метод измерения расстояния в пикселях (красная линия), как показано на изображении ниже? Желательно, чтобы у него были некоторые параметры, такие как ширина измерения (как показано в конце и начале красной линии) или что-то в этом роде. Этот тип измерения очень распространен в программном обеспечении, таком как ImageJ, я могу представить, что это должно быть несколько тривиально, чтобы сделать это в OpenCV.

Я также хотел бы взять несколько образцов по ширине изображения.

Приветствует

Я использую openCV и узнаю об этом

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Простой способ найти ширину канала будет следующим:

distance = []
h = img.shape[0]
for j in range(img.shape[1]):
    line_top = 0
    line_bottom = img.shape[0]
    found_top = False
    found_bottom = False
    for i in range(h):
        if img[i,j,0] > 0 and not found_top:
            line_top = i
            found_top = True
        if img[h-i-1,j,0] > 0 and not found_bottom:
            line_bottom = h-i
            found_bottom = True
        if found_top and found_bottom:
            distance.append(line_bottom-line_top)
            break

Но это приведет к тому, что расстояние будет учитывать очень маленькие белые пятнышки.

Для решения есть несколько вариантов:

  1. Предварительно обработайте изображение с помощью opencvmorphological transformation.
  2. Предварительно обработайте изображение с помощью opencvgaussian filter или аналогичного.
  3. Обновите код, чтобы использовать окно большего размера.

Другим решением было бы применить opencv's findContours.

Вы знаете, что это вопрос об OpenCV?

Marek R 15.02.2023 11:34

Добавлено opencv три раза для @Marek R.

YScharf 15.02.2023 11:39

Спасибо за предложение, в итоге я использовал это предложение частично в сочетании с ответом Марека, см. комментарий в его ответе.

b1063n 17.02.2023 04:49
Ответ принят как подходящий

Ваша задача довольно проста.

  1. опциональное сглаживание (фильтр Гаусса) — вам нужно поэкспериментировать с вашими данными, чтобы увидеть, помогает ли это
  2. обнаружение краев (преобразует изображение в линии, представляющие края) — например, cv::Canny
  3. Преобразование Хафа для обнаружения линий - openCV.
  4. Найдите два максимальных значения (самые длинные строки) в преобразовании Хафа
  5. у вас будет два вопроса о прямых линиях, затем вы можете использовать эту информацию для расчета расстояния между ними

Обратите внимание, что при таком подходе изображение не обязательно должно быть прямым. У вас будут линейные уравнения, которыми вы должны манипулировать с умом. Если эти две линии параллельны, то существует простая формула для определения расстояния между ними. Если они не идеально параллельны, вы должны принять это во внимание и использовать информацию об области изображения, чтобы получить среднее расстояние.

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

b1063n 17.02.2023 04:48

Другие вопросы по теме