Многоуровневые пороги изображений с помощью метода Оцу
возвращает одно пороговое значение thresh
= multithresh(A
)thresh
вычисленный для изображения A
использование метода Оцу. Можно использовать thresh
как входной параметр к imquantize
преобразовывать изображение в двухуровневое изображение.
возвращает thresh
= multithresh(A
,N
)thresh
вектор 1 на n, содержащий N
пороговые значения с помощью метода Оцу. Можно использовать thresh
как входной параметр к imquantize
чтобы преобразовать отображают A
в изображение с 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. Это значение теперь равняется количеству уровней в изображении. Отметьте, как вход является вырожденным, потому что количество уровней в изображении - лишь немногие для количества требуемых порогов. Следовательно, multithresh
возвращает 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
A
— Отобразите, чтобы быть порогом Отобразите, чтобы быть порогом в виде числового массива любой размерности. 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
— Количество пороговых значений
(значение по умолчанию) | положительное целое числоКоличество пороговых значений в виде положительного целого числа. Для N > 2
, multithresh
использует основанную на поиске оптимизацию критерия Оцу, чтобы найти пороги. Основанная на поиске оптимизация гарантирует только локально оптимальные результаты. Поскольку шанс схождения к локальному оптимуму увеличивается с N
, желательно использовать меньшие значения N
, обычно N < 10
. Максимальное позволенное значение для N
20.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
thresh
— Набор пороговых значенийНабор пороговых значений, используемых, чтобы квантовать изображение, возвратился как числовой вектор 1 на n, тип данных которого эквивалентен, отображают A
.
Эти пороги находятся в той же области значений как входное изображение A
В отличие от этого, graythresh
функция, которая возвращает нормированный порог в области значений [0, 1].
metric
— Мера эффективностиМера эффективности порогов, возвращенных как номер в области значений [0, 1]. Более высокие значения указывают на большую эффективность порогов в разделении входного изображения в N+1
классы на основе объективного критерия Оцу. Для вырожденных входных параметров, где количество уникальных значений в A
меньше чем или равно N
, metric
равняется 0.
Типы данных: double
[1] Оцу, N., "Пороговый Метод выбора от Гистограмм Уровня серого", Транзакции IEEE в Системах, Человеке, и Кибернетике, Издании 9, № 1, 1979, стр 62-66.
Указания и ограничения по применению:
multithresh
поддерживает генерацию кода С (требует MATLAB® Coder™). Обратите внимание на то, что, если вы выбираете типовой MATLAB Host Computer
целевая платформа, multithresh
генерирует код, который пользуется предварительно скомпилированной, специфичной для платформы разделяемой библиотекой. Использование разделяемой библиотеки сохраняет оптимизацию эффективности, но ограничивает целевые платформы, для которых может быть сгенерирован код. Для получения дополнительной информации смотрите Типы Поддержки Генерации кода в Image Processing Toolbox.
Входной параметр N
должно быть постоянное время компиляции.
Указания и ограничения по применению:
Входной параметр N
должно быть постоянное время компиляции.
graythresh
| imquantize
| im2bw
| rgb2ind
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.