exponenta event banner

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

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

Описание

пример

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

пример

thresh = multithresh(A,N) прибыль thresh вектор 1-by-N, содержащий N пороговые значения с использованием метода Оцу. Вы можете использовать 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. Теперь это значение равно количеству уровней в изображении. Обратите внимание, что входные данные вырождаются, поскольку количество уровней в изображении слишком мало для количества запрошенных пороговых значений. Следовательно, multitresh возвращает 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] Оцу, Н., «Метод выбора порога из гистограмм серого уровня», транзакции IEEE по системам, человеку и кибернетике, том 9, № 1, 1979, стр. 62-66.

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

..

См. также

| | |

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