Как узнать, нужно ли мне отменить пороговое значение TYPE после findContour

Я работаю с OpenCV по обнаружению рук. Но я борюсь, когда пытаюсь обвести контуры обмолоченного изображения. findContour всегда будет пытаться найти белую область в качестве контура.

Так что в основном это работает в большинстве случаев, но иногда мое обмолоченное изображение выглядит так:

_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)Как узнать, нужно ли мне отменить пороговое значение TYPE после findContourКак узнать, нужно ли мне отменить пороговое значение TYPE после findContour

Поэтому, чтобы это заработало, мне просто нужно изменить тип порога cv2.THRESH_BINARY_INV.

_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

Как узнать, нужно ли мне отменить пороговое значение TYPE после findContourКак узнать, нужно ли мне отменить пороговое значение TYPE после findContour

И это работает хорошо.

Мой вопрос: как я могу определить, когда порог нужно изменить? Нужно ли всегда находить контуры на обоих обмолоченных изображениях и сравнивать результат (в этом случае как?)? или есть способ смягчить информацию, если контуры не полностью пропущены.

РЕДАКТИРОВАТЬ : Есть способ быть на 100% уверенным, что контур похож на руку?

РЕДАКТИРОВАТЬ 2 : Так я забыл упомянуть, что я пытаюсь обнаружить кончики пальцев и дефекты, используя этот метод, поэтому мне нужны дефекты, которые с первым обмолотым изображением я не могу их найти, потому что оно перевернуто. См. синюю точку на Первом контуре изображение.

Спасибо.

findContours будет работать так же с инвертированным бинарным изображением, поэтому, если вам нужен только контур, вам не нужно об этом беспокоиться.

zteffi 10.07.2019 12:15

Хорошо, плохо, я забыл кое-что, я отредактирую вопрос. Как раз здесь мне нужно выявить дефектные точки.

Zenocode 10.07.2019 12:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
347
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Используйте метод бинаризации OSTU.
  2. Передайте пороговое изображение вспомогательному методу get_most_dominant_border_color и получите доминирующий цвет.
  3. Если цвет границы WHITE, то вы должны инвертировать изображение, используя cv2.bitwise_not, в противном случае оставьте его только таким.

get_most_dominant_border_color можно определить как:

from collections import Counter

def get_most_dominant_border_color(img):
    # Get the top row
    row_1 = img[0, :]
    # Get the left-most column
    col_1 = img[:, 0]
    # Get the bottom row
    row_2 = img[-1, :]
    # Get the right-most column
    col_2 = img[:, -1]

    combined_li = row_1.tolist() + row_2.tolist() + col_1.tolist() + col_2.tolist()

    color_counter = Counter(combined_li)

    return max(color_counter.keys(), key=lambda x:color_counter.values())

Хорошо, я понимаю алгоритм, но я получил TypeError: '>' not supported between instances of 'dict_values' and 'dict_values' исключение в этой строке: return max(color_counter.keys(), key=lambda x:color_counter.values()). Не могли бы вы объяснить больше, что он делает? В основном key: lambda part?

Zenocode 10.07.2019 14:53

Какую версию Python вы используете?

ZdaR 10.07.2019 15:42

python3.7.3, я понял, в чем проблема, сейчас пытаюсь ее решить. Когда я печатаю color_counter.keys(), вместо dict_keys([255, 0]) возвращается [255, 0].

Zenocode 10.07.2019 15:45

Поэтому, чтобы избежать этой ошибки, я конвертирую ключи в список, и это работает. КЛЮЧИ: colors_keys = list(color_counter.keys()) -- ЗНАЧЕНИЯ : colors_values = list(color_counter.values()) -- МАКС : dominant_color = max(colors_keys, key=lambda x:colors_values)

Zenocode 10.07.2019 16:29

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