Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold()

Вступ

Порогове значення – це проста та ефективна техніка для виконання базової сегментації зображення та його двійкової перетворення (перетворення на двійкове зображення), де пікселі або 0 or 1 (Або 255 якщо ви використовуєте цілі числа для їх представлення).

Як правило, ви можете використовувати порогове значення для виконання простої сегментації фону та переднього плану в зображенні, і це зводиться до варіантів простої техніки для кожного пікселя:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Просте визначення порогів має кричущі проблеми та вимагає досить незайманих вхідних даних, що робить його не дуже практичним для багатьох випадків використання. Основним порушником є ​​глобальне порогове значення, яке застосовується до всього зображення, тоді як зображення рідко бувають достатньо однорідними, щоб загальні порогові значення працювали, якщо вони не є штучними.

Глобальне порогове значення добре спрацює на розділенні символів у чорно-білій книзі на відсканованих сторінках. Загальний поріг, швидше за все, не вдасться встановити на зображенні телефоном тієї самої сторінки, оскільки умови освітлення можуть відрізнятися між частинами сторінки, що робить глобальну граничну точку надто чутливою до реальних даних.

Для боротьби з цим – ми можемо використовувати місцевий пороги, використовуючи техніку, відому як адаптивний поріг. Замість того, щоб обробляти всі частини зображення за одним правилом, ми можемо змінити поріг для кожної місцевості це здається доречним для цього. Це робить порогове визначення частково інваріантним до змін освітлення, шуму та інших факторів. Хоча це набагато корисніше, ніж глобальне порогове визначення, саме порогове визначення є обмеженою, жорсткою технікою, і його найкраще застосовувати для допомоги в попередній обробці зображень (особливо, коли йдеться про ідентифікацію зображень, які потрібно відхилити), а не для сегментації.

Для делікатніших додатків, які вимагають контексту, вам краще використовувати більш просунуті методи, включаючи глибоке навчання, яке стало рушійною силою останніх досягнень комп’ютерного зору.

Адаптивне порогове визначення з OpenCV

Давайте завантажимо зображення зі змінними умовами освітлення, де одна частина зображення більш фокусована, ніж інша, а зображення зроблено під кутом. Я зробив фотографію Гарольда Макгі «Про їжу та кулінарію» буде чудово служити!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Тепер, використовуючи звичайне порогове визначення, ми можемо спробувати відокремити літери від фону, оскільки між ними є чітка різниця кольорів. Весь колір паперу розглядатиметься як фон. Оскільки ми насправді не знаємо, яким має бути порогове значення, давайте застосуємо метод Оцу, щоб знайти хороше значення, передбачаючи, що зображення дещо бімодальне (здебільшого домінують два кольори):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

Давайте подивимося на результат:

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ой Ліва частина тексту в основному вицвіла, тінь навколо ринви повністю з'їла частину зображення, а текст занадто насичений! Це зображення «в дикій природі», і загальні правила, такі як глобальне порогове значення, не працюють належним чином. Яким має бути поріг? Це залежить від частини зображення!

Команда cv2.adaptiveThreshold() метод дозволяє нам зробити саме це:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

Команда adaptive_method може бути а cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Де C це останній встановлений аргумент. Обидва ці методи обчислюють поріг відповідно до сусідів відповідного пікселя, де block_size диктує кількість сусідів, які слід враховувати (площа мікрорайону).

ADAPTIVE_THRESH_MEAN_C бере середнє значення сусідів і віднімає C, В той час ADAPTIVE_THRESH_GAUSSIAN_C бере зважену за Гаусом суму сусідів і віднімає C.

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Це також дозволяє встановити стратегію бінаризації, але обмежується THRESH_BINARY та THRESH_BINARY_INV, і перемикання між ними ефективно перемикатиме те, що є «фоновим» і тим, що є «переднім планом».

Метод просто повертає маску для зображення, а не код повернення та маску. Давайте спробуємо сегментувати символи на тому ж зображенні, що й раніше, використовуючи адаптивне порогове значення:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Це призводить до набагато чіткішого зображення:

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Примітка: Команда block_size аргумент має бути непарним числом.

Приблизно так само ми можемо застосувати порогове значення Гауса:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Що також створює досить задовільний образ в кінці:

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Як розмір блоку (сусідньої області), так і C тут є гіперпараметри для налаштування. Спробуйте різні значення та виберіть те, яке найкраще підходить для вашого зображення. Загалом гауссове порогове значення є менш чутливим до шуму та створює дещо похмуріші та чистіші зображення, але це змінюється та залежить від вхідних даних.

Обмеження адаптивного порогового визначення

Завдяки адаптивному пороговому значенню ми змогли уникнути загального обмеження порогового розрахунку, але воно все ще є відносно жорстким і не підходить для кольорових вхідних даних. Наприклад, якщо ми завантажимо зображення ножиць і невеликого набору з різними кольорами, навіть адаптивне порогове значення матиме проблеми з його справжнім сегментуванням, із виділенням певних темних елементів, але без розгляду цілих об’єктів:

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Якщо ми налаштуємо розмір блоку та C, ми можемо змусити його вважати більші патчі частиною одного об’єкта, але потім зіткнутися з проблемами із встановленням розмірів сусідів занадто глобально, повертаючись до тих самих основних проблем із глобальним пороговим значенням:

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Висновок

В останні роки двійкова сегментація (як те, що ми робили тут) і сегментація з кількома мітками (де ви можете мати довільну кількість закодованих класів) були успішно змодельовані за допомогою мереж глибокого навчання, які є набагато потужнішими та гнучкішими. Крім того, вони можуть кодувати глобальний і локальний контекст у зображеннях, які вони сегментують. Недоліком є ​​те, що вам потрібні дані, щоб їх навчити, а також час і досвід.

Для простого встановлення порогів на льоту ви можете використовувати OpenCV і боротися з деякими обмеженнями за допомогою адаптивного визначення порогів, а не глобальних стратегій встановлення порогів. Для точної сегментації на виробничому рівні ви захочете використовувати нейронні мережі.

Йти далі – практичне глибоке навчання для комп’ютерного зору

Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Курс: «Практичне глибоке навчання комп’ютерного бачення за допомогою Python».

Адаптивне порогове визначення OpenCV у Python із cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ще один курс комп’ютерного зору?

Ми не будемо класифікувати цифри MNIST або моди MNIST. Вони свою роль давно відслужили. Занадто багато навчальних ресурсів зосереджені на базових наборах даних і базових архітектурах, перш ніж дозволити просунутим архітектурам чорної скриньки взяти на себе тягар продуктивності.

Ми хочемо зосередитися на демістифікація, практичність, розуміння, інтуїція та реальні проекти. Хочеться навчитися як ти можеш змінити ситуацію? Ми проведемо вас у подорожі від того, як наш мозок обробляє зображення, до написання дослідницького класифікатора глибокого навчання для раку молочної залози до мереж глибокого навчання, які «галюцинують», навчаючи вас принципам і теорії через практичну роботу, озброюючи вас ноу-хау та інструменти, щоб стати експертом у застосуванні глибокого навчання для вирішення проблем комп’ютерного зору.

Що всередині?

  • Перші принципи бачення та те, як комп’ютери можна навчити «бачити»
  • Різні задачі та застосування комп'ютерного зору
  • Інструменти, які полегшать вашу роботу
  • Пошук, створення та використання наборів даних для комп’ютерного зору
  • Теорія та застосування згорткових нейронних мереж
  • Обробка зсуву домену, спільного входження та інших упереджень у наборах даних
  • Передача навчання та використання часу навчання та обчислювальних ресурсів інших для вашої вигоди
  • Створення та навчання сучасного класифікатора раку молочної залози
  • Як застосувати здорову дозу скептицизму до основних ідей і зрозуміти наслідки широко поширених методів
  • Візуалізація «концептуального простору» ConvNet за допомогою t-SNE та PCA
  • Тематичні дослідження того, як компанії використовують методи комп’ютерного зору для досягнення кращих результатів
  • Правильна оцінка моделі, візуалізація прихованого простору та ідентифікація уваги моделі
  • Виконання досліджень предметної області, обробка власних наборів даних і створення тестів моделей
  • Передові архітектури, розвиток ідей, що робить їх унікальними та як їх реалізувати
  • KerasCV – бібліотека WIP для створення найсучасніших конвеєрів і моделей
  • Як аналізувати та читати документи та реалізувати їх самостійно
  • Вибір моделей в залежності від вашого застосування
  • Створення наскрізного конвеєра машинного навчання
  • Пейзаж та інтуїція під час виявлення об’єктів за допомогою Faster R-CNN, RetinaNets, SSD та YOLO
  • Екземплярна та семантична сегментація
  • Розпізнавання об'єктів у реальному часі за допомогою YOLOv5
  • Навчання детекторам об’єктів YOLOv5
  • Робота з Transformers за допомогою KerasNLP (потужна бібліотека WIP)
  • Інтеграція Transformers із ConvNets для створення підписів до зображень
  • DeepDream
  • Оптимізація моделі Deep Learning для комп’ютерного зору

Часова мітка:

Більше від Stackabuse