Многоуровневые пороги изображения с использованием метода Оцу
возвращает одиночное пороговое значение thresh = multithresh(A)thresh вычислено для изображения A используя метод Оцу. Вы можете использовать thresh в качестве входного аргумента для imquantize преобразование изображения в двухуровневое изображение.
прибыль thresh = multithresh(A,N)thresh вектор 1-by-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')

Прочтите изображение 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. Теперь это значение равно количеству уровней в изображении. Обратите внимание, что входные данные вырождаются, поскольку количество уровней в изображении слишком мало для количества запрошенных пороговых значений. Следовательно, 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
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] Оцу, Н., «Метод выбора порога из гистограмм серого уровня», транзакции IEEE по системам, человеку и кибернетике, том 9, № 1, 1979, стр. 62-66.
Примечания и ограничения по использованию:
multithresh поддерживает генерацию кода C (требуется MATLAB ® Coder™). Обратите внимание, что при выборе родовогоMATLAB Host Computer целевая платформа, multithresh создает код, использующий предварительно скомпилированную общую библиотеку для конкретной платформы. Использование общей библиотеки сохраняет оптимизацию производительности, но ограничивает целевые платформы, для которых может быть создан код. Дополнительные сведения см. в разделе Создание кода с помощью общей библиотеки.
Входной аргумент N должен быть константой времени компиляции.
Примечания и ограничения по использованию:
Входной аргумент N должен быть константой времени компиляции.
graythresh | im2bw | imquantize | rgb2ind
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.