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