像素:分辨率的单位,图像的基本单元。
分辨率(解析度):单位英寸内的像素点数。(注:图像分辨率不等于图像像素总数)
灰度:表示图像像素明暗程度的数值。范围 为0-255,白色是255,黑色是0.
色调:各种图像色彩模式下原色的明暗程度,范围0-255,共256级色调。
通道:把图像分解成一个或多个颜色成分:
对比度:不同颜色间的差别,对比度=最大灰度值/最小灰度值。
频率: 灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。图像中的高频信号指图像强度/亮度/灰度变化剧烈的地方,也就是我们常说的边缘(轮廓);图像中的低频信号指变化平缓的地方,也就是大片色块的地方。
RGB模型:
色彩三原色(CMYK):品红、黄、 青
光学三原色(RGB):红、绿、 蓝
注:
1、现在很多图像识别的任务经常将彩色图像灰度化,主要是因为在图像识别过程中,颜色对类别识别基本没啥影响,灰度化将图像由多通道变为单通道,可以大大的减少计算量。(方法:skimage.color.rgb2gray(img)
)
2、在实际应用中通常会将RGB值转化为浮点数,那是因为整数运算中会因丢弃小数部分可能导致颜色值失真,计算过程越多越失真,而浮点数运算结果更准确。(方法:img_float[i, j]=img[i,j]/255
即可将RGB值转化为[0,1]浮点数,(img_binary[i, j]=0 if img_float[i, j] <= 0.5 else 1
进一步将图像二值化)
计算机保存的图像都是一个一个的像素点,称为数字图像。图像数字化过程由图像的取样与量化来完成。
取样:就是要用多少点来描述一幅图像,取样结果质量的高低用图像的分辨率来衡量(不同像素点数的取样效果如下图)。
量化:是指要使用多大范围的数值来表示图像采样之后的一个点。
缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的:1、使图像符合显示区域的大小;2、生成对应图像的缩略图。
放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。
注:平时我们所说的简单通过拖拽的放大/缩小图像,分辨率是降低/升高的,因为总的像素点数没变,图像面积放大/缩小了。而我们这里所说的放大/缩小图像,分辨率不变。注意区分!!)
上采样原理:内插值。常用的插值方法包括:最邻近插值The nearest interpolation、双线性插值等,也可以自己定义插值方法。(最近邻插值与双线性插值)
下采样原理:假设有一幅图像Img,其大小为M*N,并且我们想对该图像进行s倍下采样,即图像缩小s倍,那么就要在高和宽上同时缩小s倍,最终得到的下采样图像的大小就为(M/s)×(N/s)。(这里注意下采样和池化的区别:下采样和池化应该是包含关系,池化属于下采样,而下采样不局限于池化,如果卷积 stride=2,此时也可以把这种卷积叫做下采样)
直方图反映的是图像中的灰度分布规律,它描述每个灰度级具有的像素个数,但不包含这些像素在图像中的位置信息。如lenna.png的直方图为(多通道图像的直方图要分别计算每个通道的直方图):
性质:
很多时候图像的灰度分布是不均匀的,因此需要直方图均衡化利用映射函数将原图像的直方图变为均匀的直方图,然后按均匀直方图修改原图像,从而获得一幅灰度分布均匀的新图像。(一般来说达不到右下图的理想情况)
上面提到的映射函数有两个条件:
步骤如下:
步骤(3)具体公式推导如下:
对于输入图像的任意一个像素p, p∈[0,255], 总能在输出图像里有对应的像素q, q∈[0,255] 使得下面等式成立(输入和输出的像素总量相等):
其中,输出图像每个灰度级的个数:
代入累加直方图公式:
在实际应用中,直接调用写好的cv2.equalizeHist(hist)
即可。
贴一个均衡化前后的对比图:
注:彩色图像均衡化,需要分解通道 对每一个通道均衡化。
线性滤波是图像处理最基本的方法,做法很简单。首先,我们有一个二维的滤波器矩阵(也就是卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,再加起来,作为该像素位置的值。这样就完成了滤波过程。
滤波和卷积的区别在于卷积需要先对滤波矩阵进行180的翻转,再进行乘积求和,但如果矩阵是对称的,那么两者就没有什么差别了。(一般我们提到卷积核都默认已经进行了翻转)
卷积核(滤波器/kernel)的规则要求:
如果用(f, f)的卷积核来卷积一张(h, w)大小的图片,每次移动一个像素,那么得出的结果是(h-f+1, w-f+1)的输出结果。 如果每次不止移动一个像素,而是s个像素,那么结果就会变为:
这个s就叫做步长。
但是,只要是f或s的值比1要大的话,那么每次卷积之后结果的长宽,要比卷积前小一些,这在一定程度上丢失了图像的信息,于是出现填充(padding)。
有了填充之后,每次卷积之后的图像大小:
same(相同)填充:为了保证卷积前后图像大小不变,于是有
假设步长 s=1:
valid(有效)填充:填充之后,卷积计算得到的图像大小有可能是分数,这时让p=0,然后结果取整数部分。
在实际应用中,往往有多个卷积核,可以认为每个卷积核代表了一种图像模式。 如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。 例如,如果我们设计了6个卷积核,那么我们认为这个图像上有6种底层纹理模式,用6种基础模式就能描绘出一副图像。下面介绍几种简单的卷积核。
将原像素中间像素值乘1,其余全部乘0。 显然像素值不会发生任何变化。
图像平滑:指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分的图像处理方法,目的是使图像亮度平缓渐变,减小突变梯度,改善图像质量。
取九个值的平均值代替中间像素值,能起到平滑的效果。
效果如图:
高斯平滑水平和垂直方向呈现高斯分布,更突出了 中心点在像素平滑后的权重,相比于均值滤波而言, 有着更好的平滑效果。它的取值主要来源于这个函数(了解即可):
图像锐化其实是为了突出图像的边缘、轮廓、或某些线性目标要素的特征,从而使图像变得清晰。这种滤波方法提高了边缘与周围像元之间的反差,因此也被称为边缘增强。图像锐化使用的是拉普拉斯变换核函数。
效果如下:
注:卷积核中间点的权值要比其他元素权值和大1,才能让这个像素保持原来的值。
除此之外,还有很多常用的卷积核,这里就不一一列举了。
首先来看个极端例子,如下图,该图左半部分为全黑,右半部分为全白,如果用Sx来卷积下面这张图的话,就会在中间黑白边界获得比较大的值。因为Sx在全黑或全白区域卷积出来的值都是0,只有在黑白交界处取得最大值,从而能提取出竖直方向的边缘特征。Sy同理能提取出水平方向的边缘特征。这里的Sx和Sy就是Prewitt算子。
但是上述的Sx和Sy在水平/垂直方向没有梯度,这对于检测带梯度的边缘(也就是斜边)效果不佳。因此一般边缘检测的卷积核都是带梯度的,例如Sobel的卷积核:
代码直接调用cv2.Sobel(img, cv2.CV_16S, 1, 0)
即可,效果如下:
注:这里卷积核的元素和是0,所以滤波后的图像会很暗,只有边缘的地方是有亮度的。