文档

multithresh

使用Otsu方法的多级图像阈值

语法

thresh = multithresh(A)
thresh = multithresh(A,N)
[thresh,metric] = multithresh(___

描述

例子

= multithresh (一个返回单个阈值图像计算一个使用大津的方法。你可以使用的输入参数imquantize将图像转换为两级图像。

例子

= multithresh (一个N返回一个1 × n向量包含N使用大津方法的阈值。你可以使用的输入参数imquantize转换图像一个变成一个图像N + 1离散的水平。

例子

度规= multithresh(___返回度规,是计算阈值有效性的度量。度规在这个范围内[0 1]数值越高,表示阈值在将输入图像分割为两个类别时的有效性越高N + 1基于大津客观标准的区域。

例子

全部折叠

读取图像并显示它。

I = imread(“coins.png”);imshow(我)

计算图像的单个阈值。

level = multithresh(I);

将图像分割成两个区域imquantize返回的阈值级别multithresh

seg_I = imquantize(I,level);图imshow (seg_I, [])

读取图像并显示它。

I = imread(“circlesBrightDark.png”);imshow (I)轴标题(原始图像的

计算两个阈值水平。

thresh = multithresh(I,2);

将图像分割为三个级别使用imquantize

seg_I = imquantize(I,thresh);

将分割图像转换为彩色图像使用label2rgb并展示出来。

RGB = label2rgb(seg_I);图;imshow (RGB)轴标题(“RGB分段图像”

读取真彩色(RGB)图像并显示它。

I = imread(“peppers.png”);imshow (I)轴标题(“RGB图像”);

从整个RGB图像生成七个级别的阈值。

threshRGB = multithresh(I,7);

为RGB图像的每个平面生成阈值。

threshForPlanes = 0 (3,7);i = 1:3 threshForPlanes(我:)= multithresh(我(:,:,i), 7);结束

使用从整个图像中计算的阈值集处理整个图像。

value = [0 threshRGB(2:end) 255];quantRGB = imquantize(I, threshRGB, value);

使用从给定平面计算的阈值向量分别处理每个RGB平面。使用为每个RGB平面生成的阈值向量量化每个RGB平面。

quantPlane = 0 (size(I));i = 1:3 value = [0 threshForPlanes(i,2:end) 255];quantPlane(:,:我)= imquantize(我(:,:,i), threshForPlanes(我:),值);结束quantPlane = uint8(quantPlane);

显示两种分离图像,并注意两种阈值方案的视觉差异。

imshowpair (quantRGB quantPlane,“蒙太奇”)轴标题(“全RGB图像逐面量化”

为了比较结果,计算每个输出图像中唯一RGB像素向量的数量。请注意,逐平面阈值方案产生的颜色比完整的RGB图像方案多约23%。

dim = size(quantRGB);quantRGBmx3 =重塑(quantRGB, prod(dim(1:2)), 3);quantPlanemx3 =重塑(quantPlane, prod(dim(1:2)), 3);colorsRGB = unique(quantRGBmx3,“行”);colorsPlane = unique(quantPlanemx3,“行”);disp ([RGB图像中独特的颜色:int2str(长度(colorsRGB))));
RGB图像中独特的颜色:188
disp ([“每架飞机的图像都有独特的颜色:”int2str(长度(colorsPlane))));
在平面对平面图像中独特的颜色:231

读取图像。

I = imread(“circlesBrightDark.png”);

找到图像中所有唯一的灰度值。

uniqLevels = unique(I(:));disp (['唯一层数= 'int2str(length(uniqLevels))]);
唯一级别数= 148

在的单调递增值处计算一系列阈值N

Nvals = [1 2 4 8];i = 1:length(Nvals) [thresh, metric] = multithresh(i, Nvals(i));disp ([' n = 'int2str(造船(我))' | metric = 'num2str(公制)]);结束
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×11 2 3 4 5 6 7 8 9

阈值图像使用seg_Neq8作为一个输入multithresh.集N等于8,比分割图像中的层数少1。multithresh返回一个度规值为1。

[thresh, metric] = multithresh(seg_Neq8,8)
打=1×81.8784 2.7882 3.6667 4.5451 5.4549 6.3333 7.2118 8.1216⋯⋯
公制= 1

再次对图像进行阈值处理,这一次增加的值N1。这个值现在等于图像中的层数。请注意输入是如何退化的,因为图像中的级别数量对于所请求的阈值数量来说太少了。因此,multithresh返回一个度规0的值。

[thresh, metric] = multithresh(seg_Neq8,9)
警告:不存在解决方案,因为图像中唯一级别的数量太少,无法找到9个阈值。返回一个任意选择的解。
打=1×91 2 3 4 5 6 7 8 9
度量= 0

输入参数

全部折叠

要设置阈值的图像,指定为任何维度的实的非稀疏数值数组。multithresh根据整个数组的聚合直方图查找阈值。multithresh将RGB图像视为3-D数值数组,并计算来自所有三个颜色平面的组合数据的阈值。

multithresh使用输入图像的范围一个(最小((:))最大((:))),作为后续计算中使用的计算直方图的限制。multithresh忽略任何一个nan在计算。任何而且分别在直方图的第一个和最后一个bin中计数。

对于简并输入,其中唯一值的数目一个小于或等于N在美国,大津的方法没有可行的解决方案。对于这样的输入,返回值包含来自的所有惟一值一个可能还有一些任意选择的额外值。

例子:I = imread('cameraman.tif');thresh = multithresh(I);

数据类型:||int16|uint8|uint16

阈值的个数,指定为正整数标量值。为N > 2multithresh使用基于搜索优化的大津准则来寻找阈值。基于搜索的优化只保证局部最优的结果。收敛到局部最优的概率随着N时,最好使用较小的值N,通常是N < 10.的最大值N是20。

例子:thresh = multithresh(I,4);

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

输出参数

全部折叠

用于量化图像的阈值集,作为1 × n向量返回,其数据类型与图像相同一个

这些阈值与输入图像的范围相同一个,不像graythresh函数,它返回范围内的规范化阈值[0, 1]

阈值有效性的度量,作为标量值返回。数值越高,表示阈值在将输入图像分割成不同类别时的有效性越高N + 1根据大津的客观标准分类。对于简并输入,其中唯一值的数目一个小于或等于N度规= 0。

数据类型:

参考文献

[1] Otsu, N.,“从灰度直方图中选择阈值方法”,《IEEE系统、人与控制论汇刊》,第9卷,第1期,1979年,第62-66页。

扩展功能

在R2012b中引入

这个话题有用吗?