OpenCV算法
1、图像的基本操作读取、显示、存储:通过调用OpenCV中的cv2.imread(),cv2.imshow(),cv2.write()分别实现。
2、图像由数组构成,黑白图像就是一个单通道的二维矩阵,如同一个的棋盘(矩阵),棋盘中每个点的数字大小代表着图像像素灰度的高低,通过像素的差异形成素描般的黑白图像;而彩色图像则是由三个通道组合而成的一个三维矩阵。彩色图像可以通过b,g,r=cv2.split(image)实现分离,或者通过数组切分实现通道分离b,g,r=image[:,:,0],image[:,:,1],image[:,:,2];对三个通道的图像合成彩色图像可以调用cv2.merge([b,g,r])实现通道合并。
数字图像处理的本质就是操作灰度矩阵。在OpenCV中实现将彩色像素转化为灰度像素的公式:
3、图像的几何变换,完成一章图像的几何变换需要两个独立的算法,首先,需要有一个实现空间坐标变换,用它描述每个像素如何从初始位置移动到终止位置;其次,还需要一个插值算法完成输出图像的每个像素的灰度值。
tx>0表示沿x轴正方形移动,反之负方向移动。
sx>1水平方向上放大,反之缩小;同理sy>1垂直方向放大,反之缩小。
α>0,顺时针旋转;反之,逆时针旋转。通过调用cv2.rotate()实现。
通过平移、缩放、旋转实现图像的空间坐标变换,统称仿射变换。
插值算法:变换后像素的灰度值等于距它最近的输入像素的灰度值
最近邻插值:(i,j)在第一象限的四个相邻整数坐标为([i],[j]),([i]+1,[j]),([i],[j]+1),([i]+1,[j]+1),其他象限类推,从而找到最接近的一个整数坐标代替。例如:(2.3,4.7)的四个相邻整数坐标分别为(2,4)(3,4),(2,5),(3,5)离他最近的整数坐标为(2,5)。
双线性插值:变换后的像素f(i+u,j+v)由原图像中坐标为所对应的周围四个像素的值决定。
其中,u=|i-[i]|,v=|j-[j]|,(i,j)与其相邻整数坐标的水平垂直距离。
在OpenCV中通过调用cv2.getAffineTransform()函数实现仿射变换的矩阵运算,通过cv2.warpAffine()函数实现图像仿射变换。投影变换矩阵计算, cv2.getPerspectiveTransform()函数实现,通过cv2.warpPerspective()函数实现投影变换功能。
4、对比增强,主要解决由图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来更加清晰。常用的有线性变换、直方图正规化、伽马变换、全局直方图均匀化等。
线性变换:
其中r,c小于图像的高和宽且大于等于0,0<=I(r,c)<=255;当a>1,输出图像的对比度增大,00,亮度增加,反之亮度减小。
分段线性变换是对不同像素范围内的值进行不同的线性变换,即把0<=I(r,c)<=255分成多段用多个对应实现线性变换。
主要程序实现:
a=2
b=20
imageout=float(a)*imagein+b
imageout[imageout]=255
imageout=np.round(imageout)
imageout=imageout.astype(np.uint8)
其中Imax,Imin分别为图像灰度级的最大值和最小值,Omax,Omin为输出图像灰度级的最大值和最小值,I(r,c)为输入图像。
在OpenCV中直方图正规化可以直接调用cv2.normalize()实现。
伽马变换:,0<γ<1时增强图像对比度,γ>1时降低图像对比度。
gama的取值为0-1或者大于1
imageout=np.power(imagein,gama)
全局直方图均衡化:
histI(k)代表灰度值等于k的像素点个数,其中k∈[0,255]。
全局直方图均衡化步骤:首先计算图像的灰度直方图;计算灰度直方图的累加直方图;根据累加直方图和直方图均衡化原理得到输入灰度级和输出灰度级之间的映射关系;最后根据第三步得到的灰度级映射关系,循环得到输出图像的每一个像素的灰度级。