扫黄除恶网站构造结构怎么做,装修公司工装公司,呼和浩特市网站,链接买卖是什么意思范围阈值操作 原理HSV颜色空间RGB与HSV颜色空间之间的转换 代码实现颜色空间的转换范围阈值操作 原理
HSV颜色空间
HSV(色相hue, 饱和度sarturation, 色明度value)颜色空间与RGB颜色空间相似。hue色相通道代表颜色类型#xff1b;saturation饱和度通道代表颜色的饱和度… 范围阈值操作 原理HSV颜色空间RGB与HSV颜色空间之间的转换 代码实现颜色空间的转换范围阈值操作 原理
HSV颜色空间
HSV(色相hue, 饱和度sarturation, 色明度value)颜色空间与RGB颜色空间相似。hue色相通道代表颜色类型saturation饱和度通道代表颜色的饱和度即颜色的浓淡或深浅、value通道代表颜色的亮度。下面的圆柱体展示了HSV颜色空间的模型
RGB与HSV颜色空间之间的转换
RGB颜色空间是通过红、绿、蓝3种基本颜色的比例来确定颜色。RGB颜色空间模型如下 OpenCV默认的是BGR颜色空间相当于RGB所以需要将RGB颜色空间转换成HSV颜色空间。在OpenCV中可以使用cv::cvtColor函数来进行不同颜色空间之间的转换。每个通道之间的具体转换方法如下 V ← m a x ( R , G , B ) V \leftarrow max(R,G,B) \\ V←max(R,G,B) S ← { V − m i n ( R , G , B ) V if V ≠ 0 0 otherwise S \leftarrow \begin{cases} \frac{V-min(R,G,B)}{V} \text{if} \quad V \neq 0 \\ 0 \text{otherwise} \end{cases} \\ S←{VV−min(R,G,B)0ifV0otherwise H ← { 60 ( G − B ) / ( V − m i n ( R , G , B ) if V R 120 60 ( B − R ) / ( V − m i n ( R , G , B ) if V G 240 60 ( R − G ) / ( V − m i n ( R , G , ) if V B 0 if R G B H \leftarrow \begin{cases} 60(G-B)/(V-min(R,G,B) \text{if} \quad VR \\ 12060(B-R)/(V-min(R,G,B) \text{if} \quad VG \\ 24060(R-G)/(V-min(R,G,) \text{if} \quad VB \\ 0 \text{if} \quad RGB \end{cases} H←⎩ ⎨ ⎧60(G−B)/(V−min(R,G,B)12060(B−R)/(V−min(R,G,B)24060(R−G)/(V−min(R,G,)0ifVRifVGifVBifRGB 如果计算出的 H 0 H0 H0则 H ← H 360 H \leftarrow H360 H←H360计算出的H, S, V的范围分别是 0 ≤ H ≤ 360 0 \leq H \leq 360 0≤H≤360, 0 ≤ S ≤ 1 0 \leq S \leq 1 0≤S≤1, 0 ≤ V ≤ 255 0 \leq V \leq 255 0≤V≤255 因为转换后的3个通道的颜色值可能会超出数据类型的最大值所以还需要进行值域的转换
如果数据是8位 S ← 255 S , H ← H / 2 S \leftarrow 255S, H \leftarrow H/2 S←255S,H←H/2即最终H, S, V的范围分别是 0 ≤ H ≤ 180 0 \leq H \leq 180 0≤H≤180, 0 ≤ S ≤ 255 0 \leq S \leq 255 0≤S≤255, 0 ≤ V ≤ 255 0 \leq V \leq 255 0≤V≤255如果数据是16位目前还不支持如果数据是32位不需要转换
用RGB中的白色来举例。在8位的RGB颜色中3个通道分别是 R 255 R255 R255 G 255 G255 G255 B 255 B255 B255。根据上面的转换公式转换成HSV颜色空间则有 V ← m a x ( R , G , B ) 255 V \leftarrow max(R, G, B) 255 V←max(R,G,B)255 V ≠ 0 V \neq 0 V0所以有 S ← V − m i n ( R , G , B ) V 0 S \leftarrow \frac{V-min(R,G,B)}{V} 0 S←VV−min(R,G,B)0 因为 R G B R G B RGB所以有 H ← 0 H \leftarrow 0 H←0 最后进行值域转换得 S ← 255 S 0 , H ← H / 2 127 S \leftarrow 255S 0, H \leftarrow H/2 127 S←255S0,H←H/2127 所以 R G B ( 255 , 255 , 255 ) RGB(255, 255, 255) RGB(255,255,255)转换成 H S V 为 HSV为 HSV为HSV(0, 0, 127)$。 下面将展示一个用HSV颜色空间来分离图片中的对象的例子
代码实现
这里使用的图片是来自下载的OpenCV中自带的示例图片...\opencv\sources\samples\data\stuff.jpg。原图如下 将该图片导入为src
Mat src{ imread(stuff.jpg) };颜色空间的转换
由于导入的图片默认是BGR模式所以要使用cv::cvtColor函数进行颜色空间的转换
Mat src_HSV;
cvtColor(src, //原图src_HSV, //结果图COLOR_BGR2HSV); //颜色空间转换类型BGR转为HSV转换后的效果如下
范围阈值操作
范围阈值操作由inRange()函数完成其函数原型如下
void cv::inRange(InputArray src,InputArray lowerb,InputArray upperb,OutputArray dst)src原图lowerb数组或Scalar类型表示范围的最小边界upperb数组或Scalar类型表示范围的最大边界dst输出图与原图尺寸相同CV_8U类型 这个函数检查图片中的每个值看它们是否落在其定义的范围内。其检查方法具体如下
对于单通道图片 d s t ( I ) l o w e r b ( I ) 0 ≤ s r c ( I ) 0 ≤ u p p e r b ( I ) 0 dst(I)lowerb(I)_0 \leq src(I)_0 \leq upperb(I)_0 dst(I)lowerb(I)0≤src(I)0≤upperb(I)0对于双通道图片 d s t ( I ) l o w e r b ( I ) 0 ≤ s r c ( I ) 0 ≤ u p p e r b ( I ) 0 ∧ l o w e r b ( I ) 1 ≤ s r c ( I ) 1 ≤ u p p e r b ( I ) 1 dst(I)lowerb(I)_0 \leq src(I)_0 \leq upperb(I)_0 \land lowerb(I)_1 \leq src(I)_1 \leq upperb(I)_1 dst(I)lowerb(I)0≤src(I)0≤upperb(I)0∧lowerb(I)1≤src(I)1≤upperb(I)1对于3通道图片由上类推 d s t ( I ) l o w e r b ( I ) 0 ≤ s r c ( I ) 0 ≤ u p p e r b ( I ) 0 ∧ l o w e r b ( I ) 1 ≤ s r c ( I ) 1 ≤ u p p e r b ( I ) 1 ∧ l o w e r b ( I ) 2 ≤ s r c ( I ) 2 ≤ u p p e r b ( I ) 2 dst(I)lowerb(I)_0 \leq src(I)_0 \leq upperb(I)_0 \land \\ \qquad lowerb(I)_1 \leq src(I)_1 \leq upperb(I)_1 \land \\ \qquad lowerb(I)_2 \leq src(I)_2 \leq upperb(I)_2 dst(I)lowerb(I)0≤src(I)0≤upperb(I)0∧lowerb(I)1≤src(I)1≤upperb(I)1∧lowerb(I)2≤src(I)2≤upperb(I)2 所以无论是多少通道的图片指定的范围都是一个闭区间。如果图片中的某个值低于范围的下边界那就会被赋予下边界值同理如果超过上边界就会被赋予上边界的值。 当上下边界是用Scalar类型定义的时候上面几个公式就不用加小括号来表示数组的下标了。 注意转换成HSV格式之后颜色值的最大值变成了Scalar(180, 255, 255). 本例中使用最大值为上边界最大值的1/6为下边界
Mat dst;
inRange(src_HSV, //HSV图Scalar(30, 37, 37), //下边界Scalar(180, 255, 255), //上边界dst); //输出图最终效果如下 可以看到3个物体被很好的识别出来了但是另一个物体并没有而且背景中的暗部也被识别了。 可以变换上下边界查看不同的效果。