Метод Оцу – это алгоритм вычисления порога бинаризации для полуторного изображения, который был разработан японским ученным Нобуюки Оцу (Отсу) в 1979 году, на данным момент он является самым быстрым и эффективном методом.
Вступление
Итак, начнем разбираться со следующего вопроса, чем нам может помочь знания порога бинаризации?С помощью порога мы можем разделить изображения на светлые объекты и темный фон. Другими словами, если значение пикселя больше порога (pixel> t), то пикселю будет присвоено 255 (белый цвет), в противном случае, когда значение пикселя меньше либо равно порогу (pixel <= t), то присваиваем 0 (черный цвет).
Как же выбрать данный порог бинаризации?
Алгоритм
Глобальный Оцу
Пусть на вход подается 24 битное изображение img.Задача: применить глобальный метод Оцу к img.
Суть метода Оцу заключается в том, чтобы выставить порог между классами таким образом, чтобы каждый их них был как можно более «плотным». Если выражаться математическим языком, то это сводится к минимизации внутриклассовой дисперсии, которая определяется как взвешенная сумма дисперсий двух классов:


Теперь можем рассмотреть алгоритм метода Оцу:
- Вычисляем гистограмму hist. Напомню, что гистограмма — это набор бинов, каждый из которых характеризует количество попаданий в него элементов выборки. В нашем случае выборка — это пиксели различной яркости, которая может принимать целые значения от 0 до 255.
- Начиная с порога t = 1, проходим через всю гистограмму, на каждом шаге пересчитывая дисперсию σ(t). Далее рассмотрим алгоритм нахождения дисперсии:
- Искомый порог doorstep найден.
Локальный Оцу
Пусть на вход подается 24 битное изображение img, n (количество разбиений изображения).Задача: применить локальный метод Оцу к img.
Приводим img к 8-битному(серому) изображение. Делим изображение на n количество частей, по вашему усмотрению или по заданию (например: 2x2, 4x1, 1x4).
Далее для каждой части находим собственный порог бинаризации по выше изложенному алгоритму и для каждой части по искомому порогу переприсваиваем пикселю 0 или 255.
Программная реализация на Python
Программная реализация глобального метода Оцу:
def bin_global(img,
w, h): |
Программная реализация локального метода Оцу с разбиением изображения на 4 части в виде 2x2:
def bin_local(filename,
m, n): |
Результаты выполнения программы
Результат выполнения глобального метода Оцу:![]() |
Справа оригинал, слева результат выполнения функции bin_global |
Результат выполнения локального метода Оцу:
![]() |
Справа оригинал, слева результат выполнения функции bin_local |
Вывод
Итак, мы рассмотрели применение метода Оцу для обнаружения объектов на изображениях.- Простота реализации.
- Метод хорошо адаптируется к различного рода изображения, выбирая наиболее оптимальный порог, при этом не имеет никаких параметров.
- Быстрое время выполнения. Требуется O(N) операций, где N — количество пикселей в изображении.
- Пороговая бинаризация чувствительна к неравномерной яркости изображения.
- При не правильном деление изображения мы можем терять объекты. Визуально это можно увидеть в пункте результат: правый верхний угол слишком темный практически не возможно распознать окно, а в левом нижнем углу не виден угловой узор на здании.