概述
一:图像阈值概念(thresholding)
阈值是什么?简单的说就是图像分割的标尺。
举例说明,看下面图片
有一堆苹果,有你喜欢的和你不喜欢的,怎样区分你喜欢的和不喜欢的,在你心中有一个标准,那我们就把这个标准量化来表示,比如,红色的是你喜欢的,其他的是你不喜欢的。那么,这个 “红色” 相当与阈值。分割出你喜欢的和你不喜欢的。同理,在图片中,一个简单的阈值例子就是选择一个像素值p,然后将小于p的所有像素强度设置为零(或其他操作),并且将所有像素值大于p设置为255(或其他操作).以这种方式,我们能够创建图像的二进制表示。选择的像素 P 就是图像的阈值,而根据 P 对图像所作的操作就叫阈值操作。
在OpenCv 中提供了两中阈值算法。
二:阈值类型
1,阈值二值化(threshold binary):
如下图,在左下的图表示图像像素点
s
r
c
(
x
,
y
)
src(x,y)
src(x,y) 值的分布情况,蓝色的水平线条表示阈值,大于阈值的让它等于最大值,小于的等于最小值。在 Input 中只有 3 个区域大于阈值,所以 Output 中有3块区域是最大值,其他的都是最小值。
This operation can be expressed as:
d
s
t
(
x
,
y
)
=
{
m
a
x
v
a
l
,
i
f
(
s
r
c
(
x
,
y
)
>
t
h
r
e
s
h
)
0
,
o
t
h
e
r
w
i
s
e
dst(x,y)=begin{cases} maxval , if (src(x,y)>thresh) \ 0, otherwiseend{cases}
dst(x,y)={maxval,if(src(x,y)>thresh)0,otherwise
2,反二值化阈值(threshold binary Inverted):
与上面的二值化阈值相反,大于阈值为最小值,小于阈值为最大值
This operation can be expressed as:
d
s
t
(
x
,
y
)
=
{
0
,
i
f
(
s
r
c
(
x
,
y
)
>
t
h
r
e
s
h
)
m
a
x
v
a
l
,
o
t
h
e
r
w
i
s
e
dst(x,y)=begin{cases} 0 , if (src(x,y)>thresh) \ maxval, otherwiseend{cases}
dst(x,y)={0,if(src(x,y)>thresh)maxval,otherwise
3,截断(truncate):
如下图所示:大于蓝色阈值水平线的等于阈值,小于的保持不变。
This operation can be expressed as:
d
s
t
(
x
,
y
)
=
{
t
h
r
e
s
h
o
l
d
,
i
f
(
s
r
c
(
x
,
y
)
>
t
h
r
e
s
h
)
s
r
c
(
x
,
y
)
,
o
t
h
e
r
w
i
s
e
dst(x,y)=begin{cases} threshold, if (src(x,y)>thresh) \ src(x,y), otherwiseend{cases}
dst(x,y)={threshold,if(src(x,y)>thresh)src(x,y),otherwise
4,阈值取零(threshold to zero):
如图所示,大于蓝色阈值水平线的爆出不变,小于的全部取最小值(0)。
This operation can be expressed as:
d s t ( x , y ) = { s r c ( x , y ) , i f ( s r c ( x , y ) > t h r e s h ) 0 , o t h e r w i s e dst(x,y)=begin{cases} src(x,y), if (src(x,y)>thresh) \ 0, otherwiseend{cases} dst(x,y)={src(x,y),if(src(x,y)>thresh)0,otherwise
5,阈值反取零(threshold to zero Inverted):
与阈值取零相反,大于时为最小值,小于时保持不变。
This operation can be expressed as:
d s t ( x , y ) = { 0 , i f ( s r c ( x , y ) > t h r e s h ) s r c ( x , y ) , o t h e r w i s e dst(x,y)=begin{cases} 0, if (src(x,y)>thresh) \ src(x,y), otherwiseend{cases} dst(x,y)={0,if(src(x,y)>thresh)src(x,y),otherwise
三,API
Cv2.Threshold():对每个数组元素应用固定级别阈值。
参数 | 说明 |
---|---|
InputArray src | input array (single-channel, 8-bit or 32-bit floating point). |
OutputArray dst | output array of the same size and type as src. |
double thresh | threshold value. 阈值 |
double maxval | 要与阈值二进制和阈值binary_inv阈值类型一起使用的最大值。 |
ThresholdTypes type | 阈值类型 (枚举类型,前面的5中,加上两种阈值寻找算法) |
代码:
static Mat src;
static int thresHold_value = 127;
static int thresHold_max = 255;
static int type_value = 2;
static int type_max = 4;
static int data=0;
/// <summary>
/// 图像阈值操作
/// </summary>
private static void ThresHold(string path)
{
using (src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
using (Mat dst = new Mat())
{
CvTrackbarCallback2 cvtCallback = new CvTrackbarCallback2(CallBackDome);
CvTrackbarCallback2 cvtCallbackType = new CvTrackbarCallback2(CallBackDome2);
new Window("SRC", WindowMode.Normal, src);
src.CopyTo(dst);
new Window("DST", WindowMode.Normal, dst);
CvTrackbar cvt = new CvTrackbar("Bar :", "DST", thresHold_value, thresHold_max, cvtCallback, dst);
CvTrackbar cvt2 = new CvTrackbar("Type :", "DST", type_value, type_max, cvtCallbackType, dst);
Cv2.WaitKey(0);
}
}
private static void CallBackDome2(int pos, object userdata)
{
Mat m = (Mat)userdata;
data = pos;
Cv2.CvtColor(src, m, ColorConversionCodes.RGB2GRAY); //转为灰度(前提条件,必须要转换才能操作阈值)
Cv2.Threshold(m, m, 0, thresHold_max, (ThresholdTypes)(pos) | ThresholdTypes.Triangle); //三角自动计算阈值法
//Cv2.Threshold(m, m, 0, thresHold_max, (ThresholdTypes)(type)|ThresholdTypes.Otsu); //自动计算阈值
new Window("DST", WindowMode.Normal, m);
}
/// <summary>
/// 调用函数
/// </summary>
/// <param name="size">阈值和阈值类型公用字段,需要做判断</param>
/// <param name="userdate"></param>
private static void CallBackDome(int size, object userdate)
{
Mat m = (Mat)userdate;
Cv2.CvtColor(src, m, ColorConversionCodes.RGB2GRAY); //转为灰度(前提条件,必须要转换才能操作阈值)
Cv2.Threshold(m, m, size, thresHold_max, (ThresholdTypes)(data)); //自定义类型和阈值
new Window("DST", WindowMode.Normal, m);
}
上面程序定义了阈值和类型两个滑块,滑动滑块,不同的值得到不同的结果
最后
以上就是俏皮狗为你收集整理的OpenCvSharp 学习笔记14 --基本的阈值操作的全部内容,希望文章能够帮你解决OpenCvSharp 学习笔记14 --基本的阈值操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复