мультимолотить

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

Синтаксис

thresh = multithresh(A)
thresh = multithresh(A,N)
[thresh,metric] = 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