otsu
.docxМинистерство цифрового развития, связи и массовых коммуникаций
Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М. А. Бонч-Бруевича»
_____________________________________________________________________________
Кафедра РАДИОТЕХНИКИ
Дисциплина «Технологии распознавания изображений и компьютерное зрение»
Практическая работа №4
«Реализация метода Отсу»
Выполнили: студенты группы РТ-22,
бригада № 6
Спица М.А.
Стулин П.А.
Сараева Л.В.
Швецов Ф.П.
Проверил: к.т.н. доцент каф. РТ,
Коровин К.О.
________________________
Санкт-Петербург
2026
Задание 1: Произвести обработку изображения методом Отсу
Алгоритм работы
Вычислить нормализованную гистограмму входного изображения. Обозначить компоненты гистограммы как
.Вычислить кумулятивные суммы
для
,
используя уравнение (10-49).Вычислить кумулятивные средние
,
используя уравнение (10-53).Вычислить глобальное среднее
,
используя уравнение (10-54).Вычислить значение межклассовой дисперсии
для
,
используя уравнение (10-62).Получить порог Оцу
как
значение
,
для которого
максимальна.
Если максимум не единственен,
получить
путем
усреднения значений
,
соответствующих обнаруженным различным
максимумам.
Рис.1 Результат работы скрипта
Листинг кода в МАТЛАБ
clc
clear all
close all
a=imread('microb.jpg');
a=rgb2gray(a);
l=256;
%% Вычислить нормализованную гистограмму входного изображения
[count, edges] = histcounts(a, 0:l);
[pix1, pix2] = size(a);
allpix = pix1 * pix2;
p = count / allpix;
figure(101)
bar(0:l-1, p);
xlabel('Уровень интенсивности i');
ylabel('Нормализованная частота p_i');
title('Нормализованная гистограмма изображения');
grid on
%% Вычислить кумулятивные суммы
P1 = cumsum(p);
%% Вычислить кумулятивные средние
csum = 0;
m = zeros(1,l);
for k = 1:l
csum = csum + (k-1) * p(k);
m(k) = csum;
end
%% Вычислить глобальное среднее
mG = sum((0:l-1) .* p);
%% Вычислить значение межклассовой дисперсии
sigmaB2 = zeros(1, l);
for k = 1:l
if (P1(k) > 0) && (P1(k) < 1)
sigmaB2(k) = (mG * P1(k) - m(k))^2 / (P1(k) * (1 - P1(k)));
else
sigmaB2(k) = 0;
end
end
figure(501)
plot(sigmaB2)
grid
%% Получить порог Оцу
% maxsigmaB2 = max(sigmaB2);
scoreind = 0;
for ind = 3:l
if (sigmaB2(ind)-sigmaB2(ind-1)<0) && (sigmaB2(ind-1)-sigmaB2(ind-2)>0)
scoreind=scoreind+1;
index(scoreind) = ind-1;
end
end
kopt = mean(index);
segm = a;
segm(segm>kopt) = 255;
segm(segm<=kopt) = 0;
figure(10000)
hold on
subplot(1,2,1)
imshow(a)
subplot(1,2,2)
imshow(segm)
