multithresh

Многоуровневые пороги изображений с помощью метода Оцу

Описание

пример

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

пример

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

пример

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

Примеры

свернуть все

Считайте изображение и отобразите его.

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

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

level = multithresh(I);

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

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

Считайте изображение и отобразите его.

I = imread('circlesBrightDark.png');
imshow(I)
axis off
title('Original 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')

Считайте истинный цвет (RGB) изображение и отобразите его.

I = imread('peppers.png');
imshow(I) 
axis off
title('RGB 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')

Чтобы сравнить результаты, вычислите количество уникальных пиксельных векторов 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

Readimage.

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. Это значение теперь равняется количеству уровней в изображении. Отметьте, как вход является вырожденным, потому что количество уровней в изображении - лишь немногие для количества требуемых порогов. Следовательно, мультимолотите, возвращает 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 и возможно некоторые дополнительные значения, которые выбраны произвольно.

Пример: I = imread('cameraman.tif'); thresh = multithresh(I);

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

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

Пример: thresh = multithresh(I,4);

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

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

свернуть все

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

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

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

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

Ссылки

[1] Оцу, N., "Пороговый Метод выбора от Гистограмм Уровня серого", Транзакции IEEE в Системах, Человеке, и Кибернетике, Издании 9, № 1, 1979, стр 62-66.

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

Смотрите также

| | |

Представленный в R2012b