【OpenCV基础】第三课:掩膜操作

掩膜操作,分辨率,FOV,像素值,位图深度,计时函数,%d

Posted by x-jeff on June 2, 2019

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.像素值

像素值是图像被数字化时由计算机赋予的值,代表了图像中某一小方块(即【像素点】)的平均亮度信息。

灰度图像通常用8位表示一个像素,这样总共有256个灰度等级(像素值在0~255之间)。

对于RGB彩色图像来说,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,亮度取值范围为0~255,共256级。按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256*256*256=16777216。通常也被简称为1600万色千万色,也称为24位色(2的24次方)。$R=0,G=0,B=0$,各通道亮度均为0,自然是黑色。$R=255,G=255,B=255$,各通道亮度均为最大,就是白色。

1.1.分辨率

分辨率可分为显示分辨率图像分辨率

  • 显示分辨率:又称屏幕分辨率,是指显示器所能显示的像素点的个数。即每行的像素点数*每列的像素点数,例如:1024*768。
  • 图像分辨率:即单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。可以简单理解为每个像素点的大小。

1.2.FOV

FOV是Field Of View的简称,即视野(CT中常称为扫描野)。通常有FOV=矩阵大小*分辨率。单位通常为mm或cm。

2.OpenCV处理图像像素

2.1.获取图像像素指针

Mat.ptr<uchar>(int i=0):获取像素矩阵的指针,索引i表示第几行,从0开始计数。

获取点$P(row,col)$的像素值:Mat.ptr<uchar>(row)[col]

⚠️像素值通常为uchar类型,因为像素值的取值范围通常为0~255,和uchar(即unsigned char)取值范围一样。但是也可以根据实际情况调整为其他类型。

2.2.获取图像的长和宽

Mat.cols输出的是图像x轴的像素个数,即Width。

Mat.rows输出的是图像y轴的像素个数,即Height。

Mat.channels()输出的是每个像素点的通道个数,RGB图像通道个数为3。

2.3.像素范围处理

saturate_cast<uchar>可用于控制像素值的取值不超过uchar所能表示的范围,即0~255。也可根据需求换成其他类型。

  1. saturate_cast<uchar>(<0),像素值小于0时返回0。
  2. saturate_cast<uchar>(>255),像素值大于255时返回255。
  3. saturate_cast<uchar>(0≤i≤255),返回i

3.掩膜操作

3.1.掩膜

数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。

3.1.1.图像掩膜

图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

3.2.矩阵的掩膜操作

假设使用的掩膜如下所示:

红色中心元素的像素值为$I(i,j)$,经过上图中的掩膜操作后,红色中心元素的像素值为:

\[5*I(i,j)-[I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]\]

用此掩膜从上至下,从左至右(❗️不得超过图像的边界)对图像进行操作,得到的图像就是增强对比度的图像。

矩阵的掩膜操作对多通道图像的操作方法见下图:

3.3.OpenCV中的API

OpenCV中对应的API:filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kernel,…)。其中:

  • src为输入图像。
  • dst为目标图像,其尺寸和通道与输入图像一致。
  • ddepth期望的目标图像类型,即位图深度。其中输出图像的位图深度应该大于或者等于输入图像的位图深度。值为-1时表示与原图(即src)的位图深度一样。
  • 定义掩膜(例如定义一个3.2部分中所示的掩膜):Mat Kernel=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0)

3.3.1.位图深度

即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标。常用有1位(单色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增强色),24位(真彩色)和32位等。

在OpenCV中,S为符号整型,U为无符号整型,F为浮点型。例如:CV_8UCV_16UCV_16SCV_32F等。

⚠️转化为不同的位图深度:src.convertTo(dst,CV_32F)

👉src.convertTo(dst, type, scale, shift):

  • src为原始图像。
  • dst为输出图像。
  • type为输出图像的位图深度。
  • scale参数对图像进行缩放:$dst(i)=src(i) \times scale$。
  • shift参数:$dst(i)=src(i)\times scale+(shift,shift,…)$。

4.计时函数

getTickCount():用于返回从操作系统启动到当前所经过的计时周期数。即计时次数。

getTickFrequency():用于返回CPU的频率。这里的单位是秒,也就是一秒内重复的次数。即一秒内,计时多少次。

即:

总次数/一秒内重复的次数=时间(s)

5.%.2d的含义

%.2d:表示输入数据的类型。

如常用的d(整型)、f(浮点型)、c(字符)、s(字符串)。

长度格式符为lhl表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。

%2d是将数字按宽度为2,采用右对齐方式输出,如果数据位数不到2位,则左边补空格。

%02d:默认情况下,数据宽度不够2位是用空格填补的(如果位数够的话就不需要补了),但是因为2d前面有0,表示数据宽度不足时用0填补。%.2d%02d一样。

6.代码地址

  1. 掩膜操作

7.参考资料

  1. 像素值(百度百科)
  2. RGB(百度百科)
  3. 图像处理中掩膜(mask)的意义
  4. 位图(百度百科)
  5. OpenCV——图像的深度与通道数讲解