为什么要了解图像深度和通道数
最近由于写opencv版的php扩展包, 而发现生成矩阵Mat的时候第三个参数传入一个表示图像的深度和通道数,第四个参数传入的表示每个通道的颜色值。 由于这个函数给除的官方文档有点不够详细,所以先了解图像的深度和通道数相关知识。 图像的通道数和深度不是只是opencv中有关,而是跟图像有关,准确来说,应该是图像都有深度和通道数。
图片深度(单位位
,例如8位深度图片)
图像深度指:存储每个像素所用的位数,也用于量度图像的色彩分辨率,来源百度百科
大概的意思图片的表示的颜色和它的深度(位)有关,深度越高的图片,可以表示的图像的每个像素可能有的颜色更多
例如:
8位深度的图像表示的颜色是:2
的8
次方,即256
个数字表示,但是由于是从0开始,所以一般是0~255
表示
16位深度的图像表示的颜色是:2
的16
次方为65536
,即可选值为0~65535
表示。
32位和64位深度的图像也以此类推。
图像通道(颜色通道)
不同类型的图片有不同的通道数,例如:
灰度图像
只有1
条通道来表示图片
BGR图像
只有3
条颜色通道,R(red,红色)通道、G(green,绿色)通道、B(blue,蓝色)通道。
而4
通道数的图片也就是BGRA
,A为alpha通道。
opencv中深度和通道表示
opencv C++中,有一个Mat对象用于生成图像Mat(rows,cols,type,scalar)
;
第三个参数type用于指定生成的图像是多少位深度
,储存类型
和通道数
,CV_(通道数)(数据类型)(通道数),如CV_8UC1,
这里我们先不关注储存类型,主要看深度
和通道数
这里的深度和通道数都影响着Mat中第四个参数的scalar,
scalar中new Scalar(val1,val2,val3,val4),一共可以传入4个值
当传入一个值的时候,表示为1通道图像,灰度图(同时,Mat中type的深度只能传入1),如果是8位深度图像则用0~255表示灰度,0显示黑色,255为白色。
如果是16位深度图像则用0~645535表示灰度,0显示为最黑,645535显示白色。
当Mat中type的深度为3的时候,表示为B、G、R三条通道,scalar中也只能传入3个值(即使传入第四个值,也会忽略)
当Mat中type的深度为4的时候,表示为B、G、R、A(alpha)4条通道,如果没有传入的值,自动补充为0。
这里Mat
中type的通道数
影响Scalar传入的值的个数
,
而Mat
中type的深度
影响Scalar传入每个数值的有效范围,也就是每个数值是0~255还是0~65535等等。
注意:
- 1.opencv中Mat只能创建RGBA(灰度,BG,BGR)图像,图像每个像素的顺序是
BGR
而不是RGB
- 2.opencv中new一个2通道(B、G)的图像是成立的,但不成真实需求的图像,说一调用
imwrite
或imshow
的时候会报错 - 3.Mat中type的通道数,限制Scalar传入的值的数量,多了忽略,少了自动补充0
- 4.Mat中type的深度,限制Scalar的传入的每个值的可选范围,超出自动表示为最大可选值,例如一个8位的BRG图像, 3个值的可选范围为0~255,如果都传入1000,也只显示为255
opencv例子
//生成一个3*3像素1通道的灰度图
Mat *mat= new Mat(3,3,CV_8UC1,Scalar(256,100,150,200));
std::cout<<format(*mat,Formatter::FMT_PYTHON)<<std::endl;
上面生成图像,由于是只有一通道,所以Scalar传入的4个值只有第一个值有效, 而8位图像可选值范围为:0~255,所以即使传入256也只能表示为255
输出结果如下:
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]
##
—End—
迭代
- 2017年06月25日 17:37 初稿