2017-03-20 10:06:06 qq_31806049 阅读数 3414
  • R语言绘图基础

    介绍R语言的绘图基础,如固有颜色、RGB取色、主题调色板介绍,文字字体、颜色、大小等参数详解,点样式、颜色、大小等参数详解,线条样式、颜色、粗细等参数详解;详细介绍R低级绘图函数:标题、图例、坐标轴、网格线、点、线等;后介绍了R绘图函数:散点图、线图、箱线图、散点图矩阵、气泡图等。

    2715 人正在学习 去看看 谢佳标

图像处理中为了节省表示图像RGB信息的空间用调色板存储彩色信息(RGB值),数据区只存储当前象素的色彩在调色板中的位置,这样就省了很多字节。不过真彩色的图像没有调色板。调色板是颜色的索引,只用于8位图像,16位以上就没有了。

随便的一幅256色BMP的图像
比如调色板区域的内容为:00 00 00 00   00 00 40 00  00 00 80 00   00 00 FF 00
                      00 20 00 00   00 20 40 00  00 20 80 00   00 20 FF 00
                      00 40 00 00   00 40 40 00  00 40 80 00   00 40 FF 00
                          ............................................
                      FF FF 00 00   FF FF 40 00  FF FF 80 00   FF FF FF 00
四个一组共256组调色板数据。
数据区内容为 03 05 0A................................
意思就是第一个象素点的颜色在调色板中的位置是03,也就是R=FF,G=00,B=00;
第二个的R=40,G=20,B=00,以次类推。
调色板的每一组值的最后一位为保留值,同时RGB的顺序是B G R 保留值。

其实很简单,可以举个简单的例子,调试板是指一块区域,一个大的结构数组
数组中每个元素由 RGBQ 构成,R存放红色值,类推,Q是保留位,一般不用。

比如有一副真彩24位图象数据(无调色板) 一组RGB(就是一个象素)总共占3个字节
(R1G1B1) (R2G2B2)(R3G3B3) (R1G1B1)  (R1G1B1)(R1G1B1)(R1G1B1)
 7个象素 有5个颜色重复的象素的,总共21字节=3*7
 
转成8位(256色) 有调色板
就变成了
n0 n1 n2 n0 n0 n0 n0(n1...nX 是一个字节,只存放索引号,对应调色板数组的序号)

-----调色板------
0-----R1G1B1Q
1-----R2G2B2Q
2-----R3G3B3Q
 加起来才19字节,这里19个字节=7+4*3

就是说,每一个索引号是一个字节,一共七个,而其中包括调色板中的3个,每一个是4个字节,因为有Q,所以就像下面所述,根据情况来决定。
重复的象素值越多,越省空间,这就是调色板的作用,但是如果重复的次数不多的话,你看到调色板里有很多Q,这样反而不省空间,不如用24位直接显示了

这里有个疑问,是否第二个举例中,应该是BGRQ,而不是RGBQ

还有个解释说,调色板不是颜色的索引, 只有具有调色板的图像数据才是索引,调色板是结构数组

2016-11-11 15:49:50 zhuhan1047026029 阅读数 546
  • R语言绘图基础

    介绍R语言的绘图基础,如固有颜色、RGB取色、主题调色板介绍,文字字体、颜色、大小等参数详解,点样式、颜色、大小等参数详解,线条样式、颜色、粗细等参数详解;详细介绍R低级绘图函数:标题、图例、坐标轴、网格线、点、线等;后介绍了R绘图函数:散点图、线图、箱线图、散点图矩阵、气泡图等。

    2715 人正在学习 去看看 谢佳标

8位位图色彩空间为256色,必定使用调色板来确定所有像素的RGB色和透明度。调色板就是256个RGBQUAD的数组,大小为256 X sizeof(RGBQUAD),每一个元素RGBQUAD代表一种颜色(包含rgb各8位数值以及8位的透明度数值)。所以8位位图中的图像数据段中的每个字节代表的并不是真实的像素颜色,而只是表示某个像素点的真实颜色在调色板中的序号。比如图像数据段中的第一个字节数值为0x13,表示该像素的实际颜色是调色板中第19个元素所表示的颜色。

RGBQUAD plane[256];RGBQUAD realColor = plane[19];

那么8位位图怎么转换位32位位图呢?

分析一下位图的构成

8位位图使用调色板,通过数据段的数据取得该像素在调色板数组的下标,根据下标获取实际颜色值。

32位位图数据段位真彩色,每32位代表的就是真实的颜色值。

但是要注意的是,8位位图数据段每一个字节代表一个像素颜色,而32位位图每4个字节代表一个像素的颜色。而图像数据中的行是4字节对齐,所以8位位图数据段做了对齐处理,不足4字节的行被扩充位4字节对齐,比如图像中一行15个像素,而位图数据段这一行占用了16个字节的空间。32位位图数据段本身就是4字节对齐无需处理。这一点很重要,当你要获取每一行某个像素的颜色,你必须找对这个像素在数据段的偏移量。

最后一点:

位图数据在内存中的每一行是倒序排列的,显示在屏幕上的第一行,其数据却在数据段的最后一行。

创建DIB(设备无关位图)的时候,位图头信息中的biHeight是正值则行数据倒序,如果是负值则行数据正序。





2015-10-18 11:01:48 hjimce 阅读数 5425
  • R语言绘图基础

    介绍R语言的绘图基础,如固有颜色、RGB取色、主题调色板介绍,文字字体、颜色、大小等参数详解,点样式、颜色、大小等参数详解,线条样式、颜色、粗细等参数详解;详细介绍R低级绘图函数:标题、图例、坐标轴、网格线、点、线等;后介绍了R绘图函数:散点图、线图、箱线图、散点图矩阵、气泡图等。

    2715 人正在学习 去看看 谢佳标

基于调色板的图像Recoloring

原文地址:http://blog.csdn.net/hjimce/article/details/49226067

作者:hjimce

一、相关理论

 最近刚搞完一个项目,难得有空闲的时间,于是打开了Siggraph 2015的网站论文,大体的扫描了今年的最新文献,在三维图形方面,CAGD向量场的相关文献,有好多篇paper,从这几年Siggraph文献看,向量场的分量加重了,这几年都有单独的向量场的模块标题,这下有的看了,还有三角网格曲面的参数化的相关paper也有好多篇除此之外现在3D打印、VR也有了专门的标题了。

    废话不多说,这里开始讲解2015 Siggraph的第一篇学习paper《Palette-based Photo Recoloring》,这篇文献可以说是一篇具有比较高的工程价值的paper,我们可以利用这个算法实现在ps、美图、天天p图等软件的一些相关功能,因为色彩变换应用场景很广,比如美白,我们希望只对肤色进行美白,而不是对整张图片进行变白。还有如果我们想要把唇色改变一下,都可以利用这个算法实现图片颜色调整颜色后的自然过渡。我觉得这篇文章最值得学习的地方是,就是图像局部颜色改变后的自然过渡实现。

    OK,下面开始讲解paper的算法实现,这篇paper有很多的细节,有些细节可能讲的和paper有点区别、或者我忽略没细讲,因为讲的太细,要写好多页,打字打到累。

、算法实现-2015 Siggraph:《Palette-based Photo Recoloring》

1、自动调色板颜色选择算法

这一部分,paper的创新点在如何对图像像素点进行快速聚类?

通过一种改进的k均值算法,进行聚类,paper默认选择k值为5,每个聚类中心颜色就是调色板颜色Ci。这个就像grab cut算法中,默认选择的图像颜色的聚类个数也是5。估计是5是一个比较好的经验值吧。然而paper说到,如果直接使用k均值算法,进行图像像素点的聚类,那么每次迭代计算,对于一个大的图片来说,很耗时间,这个我们可以想一下,如果一张彩色1000*1000的图片,如果直接使用k均值聚类,那么相当于对一百万个点进行聚类,这个计算量非常大,于是作者便提出了快速k均值图像聚类算法。那么作者是怎么进行快速k均值聚类的?

算法总流程:

(1)首先把图像的三个通道R\G\B归一化到[01]

(2)对每个通道进行直方图统计,直方图柱的个数选择bin=16。这样对于三通道图像来说,我们可以得到b*b*bbins统计直方图柱

(3)这样对于每个bin,我们知道这个bin所包了图像的哪些像素点,我们选择计算其Lab空间的颜色均值作为聚类颜色中心ci(c是小写的)。因此我们可以得到16*16*16ci

(4)接着paper直接对ci进行聚类。聚类方法是采用加权的k-means算法,权重的选择以每个bin所包含的像素点个数ni作为权值。

个人总结:上面的过程无非就是为了减少聚类点的个数,因为假设一幅图像是1000*1000的图片,那么点个数太多了,如果直接进行聚类,那很耗时。因此paper提出先使用直方图的方法,尽心预处理,把图像的n个像素点,减少为16*16*16个像素想,进行聚类,这样就可以大大减少时间了。这个就跟grab cut算法,进行预处理算法类似,可以大大提高grab cut算法的分割速度。

2k-means算法优化部分

(1)准备知识

算法开始前,我先给大家讲个例子:假设有3000个不同的人脸,我要从中挑选出300个人脸,使得这300个人脸长相都最不相似。那么你要怎么做?或者在举个更简单的例子:有3000个二维的数据点,我要从中挑选300个数据点,使得这300个数据点之间两两之间的距离最大化,你要怎么做?。我想这个问题是构建机器学习算法训练数据库,经常遇到的问题了。

我的办法是最笨的办法,如果大家有更好的办法请不吝指导。我的方法:从3000个数据集A中随机挑选出一个数据点,作为第一个被我们挑选出来的点,加入B集合中(B就是我们要求的300个点),这样A中只剩下2999个点,B中有一个点。接着从A中剩下的2999个点中挑选,与B中的数据点距离最大的那个点,继续加入B中;如此循环迭代,直到B中有300个点为止。

OK,上面的例子就是接着作者的优化k均值算法的思想了。

(2)我们回到原paper的算法:

如果我们进行直接运用k-means算法,对16*16*16中颜色进行聚类,对于k均值聚类算法存在问题:首次迭代时,如果采用聚类中心随机初始化的方法,对于聚类结果的收敛性有很大的影响,这个只要学过k-means算法的人都知道。因此接着说下paper提出了k-means的初始化方法:

因为文献的聚类个数是5,也就是我们要从16*16*16个点中,挑选出5个聚类中心点,作为k均值的初始化中心点,我们希望挑选出来的这5个点都尽量的不相似。首先从ci(ci表示上面的每个直方图的柱,也就是16*16*16个点,这里我把ci集合表示为A)选择包含的像素点ni个数最多的那个,作为第一个点,加入B中。然后从16*16*16-1个中挑选,与B中的点最不相似一个点,加入B中;如此循环迭代……。cicj的距离计算公式为:

 

其中参数σ作者默认的选择0.8,其实这个参数对结果影响不大,这个paper有提到,然后dij表示的是:cicj之间在Lab空间颜色值的距离,上面的计算是一个系数,最后要乘以剩余的每个类的n值。

个人总结:总之,我们就是要从16*16*16种颜色中,挑选出5种,使得这5种颜色最不一样,然后作为k均值聚类中心的初始化点。不说了,说多了都是泪,这么简单的算法,如果都看不懂,我只能给跪下了,打字打得好累。为了验证算法这一步写出来的代码,算法是否正确。我通过paper中的图片为例,这张图片我是通过paperpdf版打开,然后选中文献中的实例图片,右键复制,然后保存下来的。

 

它的聚类结果如下,这是直接从文献上截下来的,它的聚类结果为图片下面的五个调色版颜色:


,因此我们写出来的算法,只需要验证这张图片,聚类后得到的5个聚类中心是否跟它一样就可以了,如果一样就代表自己写的代码,应该是没错,下面是我写的最后的聚类结果:


可以看到前面五个聚类中心刚好与paper显示的颜色一模一样,最后一个是黑色聚类中心,因为文献有讲到,它也是聚类6个类,其中一个类的颜色是黑色,在迭代过程中,这个中心点的位置不更新。然后聚类结束后,丢弃掉黑色这个类。

3、颜色转换定义

这一部分是paper的相关定义,也可以跳过不看,因为不涉及算法,主要是一些函数映射的定义。由前面的聚类过程,我们可以聚出了5个类,也就是5种颜色(k-means的聚类中心),这五种颜色将作为调色板,这个从下面的图就可以知道了,每张示例图的下面都有5个颜色:


当然也有可能一个图片就只有一两种颜色,比如下图,一张图片颜色较少,因此5个聚类中心距离较小的时候,我们可以把合并,这样下面的图片就只有三种调色板了。


我们定义5种调色板原来各自的颜色为Ci,经过用户调整后颜色变为Ci'因此我们需要定义一个映射函数f,一个从Ci变换到Ci’相联系的函数。使得这个函数对于图片上的每个像素点的颜色x经过映射后的颜色为f(x),然后f(x)就是我们所要求经过颜色调整后每个像素点的颜色值。

OK,接着paper罗里吧嗦的就是为了讲关于映射函数f所需要具有的性质:

1、插值性质:对于原图片的每个像素点颜色值,如果它的值刚好为Ci,那么需要满足:


也就是说,如果图像上像素点的值刚好与五个调色板的某个颜色值Ci一样,那么我们肯定要让变换后的颜色值,就是Ci’,这个自己想想就应该是这样,无需废话。

2、值域性质:如果像素颜色值p的定义域为A,那么经过映射后f(p)也必须在A范围内。具体公式如下:


3、函数连续性,这个包含像素颜色连续性和调色板颜色连续性



4、一一对应关系。

如果:

那么:


5、亮度关系,也就是L通道的变换关系:

如果:


那么:


也就是说,如果原图像像素点p的亮度大于q的亮度,那么经过颜色调整后,满足p点的亮度还是大于q点的亮度。

个人总结:上面讲的都是废话,个人感觉很多文献就是喜欢这样,有的非常难的文献,看到定义看到想吐。接着三、四部分才是算法的重点,也是文献的最大创新点。可以认为这一部分作者是为了让自己的paper看起来更专业更牛逼一些,我们完全可以跳过不看。

三、亮度转换(L)

假设Li是调色板CiL通道值,为了简便起见,paper算法开始时,先根据L值得大小,对Ci进行排序。为我们

(1)根据上面的亮度性质关系,我们知道如果对于原始图像的5个调色板的L通道颜色值满足:

 

那么经过用户颜色调整后,五种聚类的L通道需要依旧满足:

 

上面这个式子,就相当于以一个约束条件,当用户在调整的时候,实时满足上面那个条件。那么它具体是怎么实现的呢?

根据上面的理论,当用户修改Ci’值的时候:

 

在这里需要非常明确:表示的是上次用户修改调色板j时的颜色,如果调色板j始终未被用户动过,那么的值就是初始化的时候Lj值,也就是:


在这里举个例子吧,因为这个估计会比较难理解。假设一开始调色板的颜色值,聚类成了10种,其颜色值分别为01、……、9,然后当用户调整3号调色板的时候,L3的值被用户修改成了7,那么其它的L值计算方法如下表:

初始Lj

0

1

2

3

4

5

6

7

8

9

用户修改

0

1

2

7

4

5

6

7

8

9

计算Lj

min(0,1)=0

min(1,2)=1

min(2,7)=2

7

max(4,7)=7

max(5,7)=7

max(6,7)=7

max(7,7)=7

max(8,7)=8

max(9,7)=9

 

这样的操作,能保证调色板L通道升序排序,当j>i的时候;当j<i的时候,也可以保证L通道的降序排序。

同时这种策略,如果用户吧Li’提亮了,那么对于L’(j>i)也会跟着提亮,当用户把Li’调整到原始的值的时候,Lj’也会恢复到原始的值。看一下下面的表格,我们通过把3号调色板的颜色值,重新调整到值为3,那么其它调色板的L值得计算方法如表格所示:

初始Lj

0

1

2

3

4

5

6

7

8

9

当前值Lj

0

1

2

7

7

7

7

7

8

9

3号调色板修改

0

1

2

3

7

7

7

7

8

9

重新计算Lj

min(0,1)=0

min(1,2)=1

min(2,3)=2

3

max(4,3)=4

max(5,4)=5

max(6,5)=6

max(7,6)=7

max(8,7)=8

max(9,8)=9


可以看到,表格的第三行中,3号调色板被用户重新修改到值3的时候,其它的L值也会跟着恢复到原来的数值。上面计算方法中,需要注意的是,用户修改某个调色I后,其它的调色板,需要以I为首元素,进行左右两个方向的递归,从而计算出其它调色板的颜色值。这样其实从上面的计算方法,你会发现,其实如果用户不改变最大最小值的调色板,那么其亮度范围是不会变化的,其依然是从0~9。这样也就满足了上面所说的性质2

(2)另一方面,对于L通道的处理,上面讲的是Ci类的处理,这部分讲的是各个像素的处理。对于每个像素的亮度求取,定义一个变换函数:fL这个函数定义了对于每个像素的新亮度值与调色板亮度值之间的函数关系。其实fL只用了两个相邻的palette entries进行加权组合,以此求解每个像素点的亮度值。

四、色彩转换(ab通道)

这一部分是文献的重点,也是paper的最大创新点。需要慢慢解读。前面我们已经定义了一个简单的亮度转换函数fL.也就是通过调色板的亮度,进行调色像素的亮度。本节引入lab函数用于颜色转换。

1、单一调色板

首先我们假设我们调色板就只有一种颜色C,也就是我们聚类的时候,只聚了一种颜色。我们以这种情况为特例进行讲解。假设当调色板的颜色从C调整为C’时,此时的颜色变换函数为f1。对于任意的一个颜色x我们希望求解:

 

正常的思维是,我们希望每个颜色x,变换后都具有相同的增量(C’-C)
也就是说我们的一般思维是:

X’=X+C’-C

然而,这样的想法是不能满足上面的值域性质的,因为我们希望映射后,颜色范围依旧没有改变,如果简单的用这种方法,那么颜色就会很容易超出值域范围内了,于是呢作者就提出了一种方法,使得调整后的色域范围依旧不变的函数。


2、多调色板

前面我们定义的是只有一种调色的情况,我们得到f1(x)函数,那么接着我们要结合实际,就是要有多种调色板的情况,也就是假设我们颜色聚类,聚了k种,paper默认选择k=5。对于有多个调色,文献直接采用一种颜色情况的加权组合,作为结果,这部分需要通过求解一个方程组,才能获得权重。其具体的示意图如下:

 

五、色彩转换结果

接着看一下我根据paper写出来的demo测试效果吧。首先先用paper上的一些图片示例作为测试,看看效果能不能达到和文章一样的效果再说:

测试示例1


转换结果,上面我通过把衣服的色彩进行了转换,效果相当perfect利用算法实现了上面衣服的颜色调整

测试结果2

 

看出上面那副图的变换了吗?花蕊的中心变的更绿了,感觉过渡很自然,好开心,神器的算法 

测试结果3下面这幅图呢?看出变化了吗?地面的颜色、云朵的颜色都变成了绿色了。


接着在测试两张文献没有图片

测试结果4

 

把跟地面相似的颜色变了一下,Perfect。

测试结果5

 

上面的测试实例是通过把花草由绿色变为为另外一种颜色。

这篇文章后面还有很多细节,我没有具体的讲,需要自己慢慢细读paper,才能达到paper的效果,不然会出现过度不自然的现象,比如paper并不是对每个像素点进行recoloring计算,而是通过跟上面的k均值聚类的方法,进行bins颜色划分,然后对bins的每个节点进行recoloring,然后通过这些节点,对原始图片的像素点进行立方插值。

参考文献:

1、《Palette-based Photo Recoloring》

**********************作者:hjimce   时间:2015.10.10  联系QQ:1393852684   地址:http://blog.csdn.net/hjimce   原创文章,转载请保留本行信息********************

 





2010-07-31 22:32:00 tlovet1314 阅读数 2694
  • R语言绘图基础

    介绍R语言的绘图基础,如固有颜色、RGB取色、主题调色板介绍,文字字体、颜色、大小等参数详解,点样式、颜色、大小等参数详解,线条样式、颜色、粗细等参数详解;详细介绍R低级绘图函数:标题、图例、坐标轴、网格线、点、线等;后介绍了R绘图函数:散点图、线图、箱线图、散点图矩阵、气泡图等。

    2715 人正在学习 去看看 谢佳标

1.1 位图和调色板的概念

1. 真彩色图: 它的颜色数高达256×256×256种,也就是说包含我们上述提到的RGB颜色表示方法中所有的颜色。真彩色图是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。

 

1.2 bmp文件格式

(WORD为无符号16位整数,DWORD为无符号32位整数,LONG32长整型)

1.      bmp文件大体上分成四个部分:

1)位图文件头BITMAPFILEHEADER,共14个字节。

2)位图信息头BITMAPINFOHEADER,共40个字节。

3)调色板Palette

4)实际的位图数据ImageDate

调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有 个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节。(红色,绿色与蓝色的排序与一般图像文件的颜色数据排序恰好相反~)

对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的RGB

 

2. 要注意两点:

1) 每一行的字节数必须是4的整倍数,如果不是,则需要补齐。

2) 一般来说,BMP文件的数据从下到上,从左到右的

 

1.3 显示一个bmp文件的C程序

一,loadBmpFile函数实现过程:

1.    打开文件到HFILE结构变量中。

2.    HFILE变量中读取BITMPFILEHEADERBITMAPINFOHEADER两个结构变量。

3.    计算图像行字节数和图像总字节数。

4.    计算实际使用到的颜色个数并验证结果.

5.    填写bf.bfsize;

6.    分配全局内存空间,大小为(bitmapinfoheader+palette+实际图像)返回一个句柄。

7.    LPBITMAPINFOHEADER指向分配的全局内存空间。

8.    文件指针重新定位到BITMAPINFOHEADER开始处并将内容读入LPBITMAPINFOHEADER类型指针中。关闭文件。_hread_lread的区别

9.    NumColors不为零时,说明用到了调色板。为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加NumColorsPALETTENTRY

10.LOGPALETTE类型指针pPal指向该内存区,填写逻辑调色板结构的头。lpRGB指向的是调色板开始的位置,填写pPal->palPalEntry每一项。

11.产生逻辑调色板全局变量hPalette,解锁并释放局部内存。

12.获得设备上下文句柄。

13.如果产生了逻辑调色板,将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在hPrevPalette中。

14.产生位图句柄。使用完现在的调色板,就要把原来的调色板还原至DC中。

15.释放设备上下文,解锁内存区。

 

二,响应WM_PAINT消息:

1.    获得屏幕设备上下文BeginPaintGetDC的区别

2.    建立一个内存设备上下文。当有调色板,将调色板选入屏幕设备上下文和内存设备上下文。

3.    将位图选入内存设备上下文,显示位图,释放内存设备上下文,释放屏幕设备上下文。

注意1)要2DC的原因是,在绘制位图时要将源(内存)设备上下文的内容复制到目的(屏幕)设备上下文中。

 

   书提供的代码运行都有问题,经过修改,错误是没了,不过就是图片显示不出来!而且对它的代码还有一些不太明白,比如系统如何发送WM_LOADBITMAP这个消息的呢?

 

终于解决了!!

答:看书上提供的代码时没有注意到有一个.rc为后缀的资源文件,里面定义了一个menu,menu里面有一个子控件open,它和WM_LOADBITMAP关联。以前从来没想过去手动编辑资源文件,要不是昨天开始尝试使用dos下编译c++文件,怎么也没想要打开这个文件看看。看来放一放还是对了,忍了这么久终于解放了!稍后写一篇关于如果VC资源文件结构的文章,对以后学习有帮助。

2017-07-24 23:16:23 pianzang5201 阅读数 221
  • R语言绘图基础

    介绍R语言的绘图基础,如固有颜色、RGB取色、主题调色板介绍,文字字体、颜色、大小等参数详解,点样式、颜色、大小等参数详解,线条样式、颜色、粗细等参数详解;详细介绍R低级绘图函数:标题、图例、坐标轴、网格线、点、线等;后介绍了R绘图函数:散点图、线图、箱线图、散点图矩阵、气泡图等。

    2715 人正在学习 去看看 谢佳标

通过调节滑动条来设定画板颜色。我们 要创建一个窗口来显示显色,还有三个滑动条来设置 B,G,R 的颜色。当我们 滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。 cv2.getTrackbarPos() 函数的一个参数是滑动条的名字,第二个参数 是滑动条被放置窗口的名字,第三个参数是滑动条的默认位置。第四个参数是 滑动条的最大值,第五个函数是回调函数,每次滑动条的滑动都会调用回调函数。


import cv2
import numpy as np

def nothing(x):
    pass

img = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('image')

cv2.createTrackbar("R", 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

switch = '0:0FF\n1:ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)

while(1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1)&0xFF
    if k == 27:
        break
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')

    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]

cv2.destroyAllWindows()



结果图:(最下面的是颜色开关




调色板

阅读数 14

没有更多推荐了,返回首页