图像的深度以及通道数

Posted by hiho on June 25, 2017

为什么要了解图像深度和通道数

最近由于写opencv版的php扩展包, 而发现生成矩阵Mat的时候第三个参数传入一个表示图像的深度和通道数,第四个参数传入的表示每个通道的颜色值。 由于这个函数给除的官方文档有点不够详细,所以先了解图像的深度和通道数相关知识。 图像的通道数和深度不是只是opencv中有关,而是跟图像有关,准确来说,应该是图像都有深度和通道数。

图片深度(单位,例如8位深度图片)

图像深度指:存储每个像素所用的位数,也用于量度图像的色彩分辨率,来源百度百科
大概的意思图片的表示的颜色和它的深度(位)有关,深度越高的图片,可以表示的图像的每个像素可能有的颜色更多
例如:
8位深度的图像表示的颜色是:28次方,即256个数字表示,但是由于是从0开始,所以一般是0~255表示
16位深度的图像表示的颜色是:216次方为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。

这里Mattype的通道数影响Scalar传入的值的个数, 而Mattype的深度影响Scalar传入每个数值的有效范围,也就是每个数值是0~255还是0~65535等等。

注意:

  • 1.opencv中Mat只能创建RGBA(灰度,BG,BGR)图像,图像每个像素的顺序是BGR而不是RGB
  • 2.opencv中new一个2通道(B、G)的图像是成立的,但不成真实需求的图像,说一调用imwriteimshow的时候会报错
  • 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 初稿

参考文章