本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
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。也可根据需求换成其他类型。
saturate_cast<uchar>(<0)
,像素值小于0时返回0。saturate_cast<uchar>(>255)
,像素值大于255时返回255。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_8U
、CV_16U
、CV_16S
、CV_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
(字符串)。
长度格式符为l
和h
,l
表示输入长整型数据(如%ld
)和双精度浮点数(如%lf
)。h
表示输入短整型数据。
%2d
是将数字按宽度为2,采用右对齐方式输出,如果数据位数不到2位,则左边补空格。
%02d
:默认情况下,数据宽度不够2位是用空格填补的(如果位数够的话就不需要补了),但是因为2d
前面有0,表示数据宽度不足时用0填补。%.2d
和%02d
一样。