multithresh
使用大津方法的多级图像阈值
描述
例子
将图像分割成两个区域
读取图像并显示它。
我= imread (“coins.png”);imshow(我)
计算图像的单一阈值。
水平= multithresh(我);
将图像分割为两个区域使用imquantize
返回的阈值级别multithresh
.
seg_I = imquantize(我、水平);图imshow (seg_I, [])
利用两个阈值将图像分割为三层
读取图像并显示它。
我= imread (“circlesBrightDark.png”);imshow (I)轴从标题(原始图像的)
计算两个阈值水平。
打= multithresh(我,2);
将图像分割成三个层次使用imquantize
.
seg_I = imquantize(我打);
将分割后的图像转换为彩色图像label2rgb
和显示。
RGB = label2rgb (seg_I);图;imshow (RGB)轴从标题(RGB图像分割的)
比较阈值整幅图像和逐平面阈值
读取真彩色(RGB)图像并显示它。
我= imread (“peppers.png”);imshow (I)轴从标题(“RGB图像”);
从整个RGB图像中生成七个级别的阈值。
threshRGB = multithresh (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平面。
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 =独特(quantRGBmx3,“行”);colorsPlane =独特(quantPlanemx3,“行”);disp ([RGB图像中独特的颜色:int2str(长度(colorsRGB))));
唯一的颜色在RGB图像:188
disp ([“逐面图像中独特的颜色:”int2str(长度(colorsPlane))));
在逐平面图像中唯一的颜色:231
使用Metric Output参数检查结果
读取图像。
我= imread (“circlesBrightDark.png”);
找出图像中所有唯一的灰度值。
uniqLevels =独特的(我(:));disp ([“唯一级别的数量=”int2str(长度(uniqLevels))));
唯一级别的数量= 148
的单调递增值处计算一系列阈值N
.
Nvals = [1 2 4 8];为i = 1:长度(Nvals) [thresh, metric] = multithresh(i, Nvals(i));disp ([“N =”int2str(造船(我))' | metric = 'num2str(公制)]);结束
N = 1 | metric = 0.4767 N = 2 | metric = 0.98715 N = 4 | metric = 0.99648 N = 8 | metric = 0.99902
应用8个阈值集得到一个9级分割imquantize
.
seg_Neq8 = imquantize(我打);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
再次设置图像的阈值,这次增加的值N
1。这个值现在等于图像中的层数。注意输入是如何退化的,因为图像中的级别数量对于请求的阈值数量来说太少了。因此,multithresh
返回一个度规
值0。
[thresh, metric] = multithresh(seg_Neq8,9)
警告:没有解决方案存在,因为图像中唯一级别的数量太少,无法找到9个阈值。返回任意选择的解。
打=1×91 2 3 4 5 6 7 8 9
度量= 0
输入参数
一个
- - - - - -要阈值的图像
数字数组
要阈值的图像,指定为任意维度的数值数组。multithresh
根据整个数组的聚合直方图查找阈值。multithresh
将RGB图像视为一个三维数字数组,并计算三种颜色平面的组合数据的阈值。
multithresh
使用输入图像的范围一个
,(最小((:))最大((:)))
,作为后续计算中使用的直方图的计算极限。multithresh
忽略任何一个nan
在计算。任何正
而且负
分别在直方图的第一个和最后一个容器中计数。
对于简并输入,其中唯一值的数量一个
是否小于等于N
,使用大津的方法没有可行的解决方案。对于这样的输入,返回值打
包含的所有惟一值一个
可能还有一些任意选择的值。
数据类型:单
|双
|int16
|uint8
|uint16
N
- - - - - -阈值数目
1
(默认)|正整数
阈值的数目,指定为正整数。为N > 2
,multithresh
采用基于搜索优化的Otsu准则寻找阈值。基于搜索的优化只保证局部最优结果。由于收敛到局部最优的机会随着N
时,最好使用较小的值N
,通常是N < 10
.的最大允许值N
是20。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
输出参数
打
—阈值设置
1)×(n数值向量
用于量化图像的阈值集,作为1 × n的数字向量返回,其数据类型与图像相同一个
.
这些阈值与输入图像的范围相同一个
,不像graythresh
函数,该函数返回范围[0,1]内的规范化阈值。
度规
-有效性的衡量
[0,1]范围内的数字
阈值有效性的度量,作为范围[0,1]中的数字返回。越高的值表示阈值在分离输入图像时越有效N + 1
根据大津的客观标准进行分类。对于简并输入,其中唯一值的数量一个
是否小于等于N
,度规
= 0。
数据类型:双
参考文献
[1] Otsu, N.,“从灰度直方图的阈值选择方法”,《IEEE系统、人与控制论汇刊》1979年,第9卷第1期,第62-66页。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
multithresh
支持C代码的生成MATLAB®编码器™).请注意,如果您选择通用的MATLAB主机
目标平台,multithresh
生成使用预编译的特定于平台的共享库的代码。使用共享库可以保持性能优化,但限制了可以为其生成代码的目标平台。有关更多信息,请参见图像处理工具箱中支持代码生成的类型.输入参数
N
必须是编译时常量。
GPU的代码生成
使用GPU Coder™为NVIDIA GPU生成CUDA®代码。
使用注意事项和限制:
输入参数
N
必须是编译时常量。
版本历史
介绍了R2012b
另请参阅
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。