multithresh

Многоуровневые пороги изображений с использованием метода Otsu

Описание

пример

thresh = multithresh(A) возвращает одно пороговое значение thresh вычисляется для A изображений использование метода Оцу. Можно использовать thresh как входной параметр imquantize для преобразования изображения в двухуровневое изображение.

пример

thresh = multithresh(A,N) возвращает thresh вектор 1-by-N, содержащий N пороговые значения с использованием метода Otsu. Можно использовать thresh как входной параметр imquantize для преобразования изображений A в изображение с N+1 дискретные уровни.

пример

[thresh,metric] = multithresh(___) возвращает metric, мера эффективности вычисленных порогов.

Примеры

свернуть все

Чтение изображения и его отображение.

I = imread('coins.png');
imshow(I)

Figure contains an axes. The axes contains an object of type image.

Вычислите одно пороговое значение для изображения.

level = multithresh(I);

Сегментируйте изображение в две области с помощью imquantize , задающий пороговый уровень, возвращаемый multithresh .

seg_I = imquantize(I,level);
figure
imshow(seg_I,[])

Figure contains an axes. The axes contains an object of type image.

Чтение изображения и его отображение.

I = imread('circlesBrightDark.png');
imshow(I)
axis off
title('Original Image')

Figure contains an axes. The axes with title Original Image contains an object of type image.

Вычислите два пороговых уровня.

thresh = multithresh(I,2);

Сегментируйте изображение на три уровня с помощью imquantize .

seg_I = imquantize(I,thresh);

Преобразуйте сегментированное изображение в цветное с помощью label2rgb и отобразите его.

RGB = label2rgb(seg_I); 	 
figure;
imshow(RGB)
axis off
title('RGB Segmented Image')

Figure contains an axes. The axes with title RGB Segmented Image contains an object of type image.

Чтение изображения truecolor (RGB) и отображение его.

I = imread('peppers.png');
imshow(I) 
axis off
title('RGB Image');

Figure contains an axes. The axes with title RGB Image contains an object of type image.

Сгенерируйте пороги для семи уровней из всего изображения RGB.

threshRGB = multithresh(I,7);

Сгенерируйте пороги для каждой плоскости изображения RGB.

threshForPlanes = zeros(3,7);			

for i = 1:3
    threshForPlanes(i,:) = multithresh(I(:,:,i),7);
end

Обработайте все изображение с набором порога значений, вычисленных из всего изображения.

value = [0 threshRGB(2:end) 255]; 
quantRGB = imquantize(I, threshRGB, value);

Обработайте каждую плоскость RGB отдельно, используя пороговый вектор, вычисленный из заданной плоскости. Квантуйте каждую плоскость RGB, используя пороговый вектор, сгенерированный для этой плоскости.

quantPlane = zeros( size(I) );

for i = 1:3
    value = [0 threshForPlanes(i,2:end) 255]; 
    quantPlane(:,:,i) = imquantize(I(:,:,i),threshForPlanes(i,:),value);
end

quantPlane = uint8(quantPlane);

Отобразите оба апостериализированных изображения и отметьте визуальные различия в двух схемах порога.

imshowpair(quantRGB,quantPlane,'montage') 
axis off
title('Full RGB Image Quantization        Plane-by-Plane Quantization')

Figure contains an axes. The axes with title Full RGB Image Quantization Plane-by-Plane Quantization contains an object of type image.

Чтобы сравнить результаты, вычислите количество уникальных векторов RGB-пикселей в каждом выходном изображении. Обратите внимание, что схема плоского порога дает примерно на 23% больше цветов, чем полная схема изображения RGB.

dim = size( quantRGB );
quantRGBmx3   = reshape(quantRGB,   prod(dim(1:2)), 3);
quantPlanemx3 = reshape(quantPlane, prod(dim(1:2)), 3);

colorsRGB   = unique(quantRGBmx3,   'rows' );
colorsPlane = unique(quantPlanemx3, 'rows' );

disp(['Unique colors in RGB image            : ' int2str(length(colorsRGB))]);
Unique colors in RGB image            : 188
disp(['Unique colors in Plane-by-Plane image : ' int2str(length(colorsPlane))]);
Unique colors in Plane-by-Plane image : 231

Чтение изображения.

I = imread('circlesBrightDark.png');

Найдите все уникальные значения полутонового цвета на изображении.

uniqLevels = unique(I(:));  

disp(['Number of unique levels = ' int2str( length(uniqLevels) )]);
Number of unique levels = 148

Вычислите ряд порогов при монотонно увеличивающихся значениях N.

Nvals = [1 2 4 8];
for i = 1:length(Nvals)
    [thresh, metric] = multithresh(I, Nvals(i) );
    disp(['N = ' int2str(Nvals(i)) '  |  metric = ' num2str(metric)]);
end
N = 1  |  metric = 0.54767
N = 2  |  metric = 0.98715
N = 4  |  metric = 0.99648
N = 8  |  metric = 0.99902

Примените набор из 8 пороговых значений, чтобы получить 9-уровневую сегментацию с помощью imquantize .

seg_Neq8 = imquantize(I,thresh);
uniqLevels = unique( seg_Neq8(:) )
uniqLevels = 9×1

     1
     2
     3
     4
     5
     6
     7
     8
     9

Порог изображения при помощи seg_Neq8 как вход в multithresh. Задайте N равно 8, что на 1 меньше, чем количество уровней в этом сегментированном изображении. multithresh возвращает metric значение 1.

[thresh, metric] = multithresh(seg_Neq8,8)
thresh = 1×8

    1.8784    2.7882    3.6667    4.5451    5.4549    6.3333    7.2118    8.1216

metric = 1

Снова пороговите изображение, на этот раз увеличивая значение N по 1. Теперь это значение равняется количеству уровней в изображении. Обратите внимание, что вход вырожден, потому что количество уровней в изображении слишком мало для количества запрашиваемых порогов. Следовательно, multiphresh возвращает metric значение 0.

[thresh, metric] = multithresh(seg_Neq8,9)
Warning: No solution exists because the number of unique levels in the image are too few to find 9 thresholds. Returning an arbitrarily chosen solution.
thresh = 1×9

     1     2     3     4     5     6     7     8     9

metric = 0

Входные параметры

свернуть все

Изображение, которое должно быть пороговым, заданным как числовой массив любой размерности. multithresh находит пороги на основе совокупной гистограммы всего массива. multithresh рассматривает изображение RGB как 3-D числовой массив и вычисляет пороги для объединенных данных из всех трех цветовых плоскостей.

multithresh использует область значений входного изображения A, [min(A(:)) max(A(:))], как пределы для вычисления гистограммы, используемой в последующих расчетах. multithresh игнорирует любые NaNs в расчетах. Любой Infs и -Infs подсчитаны в первом и последнем интервале гистограммы, соответственно.

Для вырожденных входов, где количество уникальных значений в A меньше или равно N, не существует жизнеспособного решения с использованием метода Оцу. Для таких входов возврата значение thresh содержит все уникальные значения из A и, возможно, некоторые дополнительные значения, которые выбираются произвольно.

Типы данных: single | double | int16 | uint8 | uint16

Количество значений порога, заданное в виде положительного целого числа. Для N > 2, multithresh использует поисковую оптимизацию критерия Оцу, чтобы найти пороги. Основанная на поиске оптимизация гарантирует только локально оптимальные результаты. Поскольку вероятность сходиться к локальному оптимуму увеличивается со Nпредпочтительно использовать меньшие значения N, обычно N < 10. Максимально допустимое значение для N 20.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Выходные аргументы

свернуть все

Набор порога значений, используемых для квантования изображения, возвращенный как 1-by-N числовой вектор, тип данных которого совпадает с типом изображения A.

Эти пороги находятся в той же области значений, что и входе изображение A, в отличие от graythresh функция, которая возвращает нормированный порог в области значений [0, 1].

Мера эффективности порогов, возвращаемая как число в области значений [0, 1]. Более высокие значения указывают на большую эффективность порогов в разделении входа изображения на N+1 классы на основе объективного критерия Оцу. Для вырожденных входов, где количество уникальных значений в A меньше или равно N, metric равен 0.

Типы данных: double

Ссылки

[1] Otsu, N., «A Threshold Selection Method From Gray-Level Histograms», IEEE Transactions on Systems, Man, and Cybernetics, Vol. 9, No. 1, 1979, pp. 62-66.

Расширенные возможности

..

См. также

| | |

Введенный в R2012b