特点: 输入图像和输出图像是点对点的拷贝操作,这个拷贝过程中,灰度值会经过转换操作。这个转换操作可以是线性的也可以是非线性的。可表示成:
应用: 对比度增强、对比度拉伸、图像灰度平移(调亮、调暗)、二值化、边缘线、切割。
案例:线性点操作
假设一副图像DA,进行线性点操作后得到Da,转换函数可表示为:Da=f(DA)=aDA+b
a为对比度调节参数,如果a>1那么对比度将会提升(灰度值的差异),如果0 b为灰度值平移项,如果b>0,图像进行了整体调亮操作,如果b<0,图像整体进行调暗。
案例:非线性点操作
假设图像非常复杂,可能不是8位图像,可能为12位、16位,这种情况下,图像的像素值可能为-1000,+1000,这种情况下计算机可能只想关注其在正数范围内,因此需要对图像整个的灰度值进行压缩,例:f(x)=x+C(Dm-x)
x是输入图像的灰度值;C为控制放大缩小的参数,即对比度系数;Dm为最大灰度值参数。
x趋于中值的灰度值像素,有明显的变化;x趋于两端的灰度值的像素,变化比较微小。
特点: 两个(n个)图像,像素对像素的运算,生成第三(n+1)个图像。并且图像的大小要保持一致。可表示成:
(1)加法操作:①通过平均的方式来除噪声。能够去噪的原因是,自然界中的噪声都是Random存在的,做多张图像的平均可以实现噪声去除。例如通过高倍天文望远镜+摄像机,可以拍到夜空的星云,但是这些图像非常的不清晰,因为这些高倍放大的图像引入很多噪声,解决方法是在非常短的时间内,连续拍摄很多张图像,然后取这些图像的平均,就能得到清晰的图像。②多次曝光,同一图像中出现一个事物多次;③蓝屏摄影,在蓝屏下拍摄,将背景叠加在一起。
API: cv.add(img1,img2)函数把两幅图像相加,或者可以通过numpy操作添加两个图像,如res=img1+img2.
注意: OpenCV加法和numpy加法之间存在差异。OpenCV的加法操作是饱和操作,而numpy添加的是模运算。
import cv2
import matplotlib.pyplot as plt
import numpy as np
x=np.uint8([250])
y=np.uint8([10])
print(cv2.add(x,y))#250+10=260饱和操作变为255
print(x+y)#250+10=260取模操作变为4
图像混合其实也是加法,但是不同的是两幅图像的权重不同,给人一种混合或者透明的感觉:
g(x)=(1-α)f0(x)+aαf(x)
API:cv2.addWeighted(img1,α,img2,β,γ)
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img1=cv2.imread('rain.png')
img2=cv2.imread('view.png')
#2 图像混合
img=cv2.addWeighted(img1,0.3,img2,0.7,0)
# 3 显示图像
cv2.imshow('hunhe',img)
cv2.waitKey(0)
(2)减法操作:①通过减法操作去除背景。例如背景是一个固定的情况,前景是一个目标在运动,可以求取背景,通过减法操作抹去背景;②通过减法操作检测到目标运动;③求梯度,实际就是像素与像素之间减法操作操作。
(3)乘法操作:通过算法已经能够求取最优二值化值,对图像进行二值化,得到感兴趣区域(二值图像),但是得到二值图像没有感兴趣区域的像素值信息,因此可以应用乘法操作,提取感兴趣区域的像素值信息。
(4)除法操作
目标: 改变图像空间坐标关系(平移、旋转…)。
几何操作: 涉及空间转换(配准部分详细介绍)和灰度差值。
(1)平移
定义: 将图像按照指定方向和距离移动到相应的位置
API: cv2.warpAffine(img,M,dsize)
参数:
img:输入图像
M:2*3移动矩阵
对于(x,y)处的像素点,要把
它移动到(x+tx,y+ty)处时,矩阵M应该设置为:
M为np.float32类型的Numpy数组。
dsize:输出图像大小
注意: 输出图像的大小,他应该是(宽度、高度)的形式。请记住,width=列数,height=行数
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('view.png')
#2. 图像移动
print(img.shape)#(271, 271, 3)
#平移矩阵
M=np.float32([[1,0,100],[0,1,50]])
img2=cv2.warpAffine(img,M,(271, 271))
#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('wrapAffine',img2)
cv2.waitKey(0)
(2)旋转
定义: 图像旋转,是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
API:
M=cv2.getRotationMetrix2D(Center,angle,scale)
cv2.warpAffine(img,M,dsize)
参数:
Center:旋转中心
angle:旋转角度
scale:缩放比例
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('view.png')
#2. 图像旋转
print(img.shape)#(271, 271, 3)
##2.1 旋转矩阵
M=cv2.getRotationMatrix2D((271/2,271/2),90,1)
##2.2 旋转,利用平移的API实现
img2=cv2.warpAffine(img,M,(271, 271))
#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('rotion',img2)
cv2.waitKey(0)
(3)缩放
定义: 就是对图像的大小进行调整,即使图像放大或缩小
API: cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
参数:
src:输入图像
dsize:绝对尺寸,直接指定调整后图像的大小
fx,fy:相对尺寸,将dsize设置为None,然后将fx,fy设置为比例因子。
interpolation:差值方法
插值 | 含义 |
---|---|
cv2.INTER_LINEAR | 双线性差值 |
cv2.INTER_NEAREST | 最近邻差值 |
cv2.INTER_AREA | 像素区域重采样,默认 |
cv2.INTER_CUBIC | 双三次插值 |
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('view.png')
#2. 图像缩放
# 2.1 绝对尺寸
img1=cv2.resize(img,(250,250),interpolation=cv2.INTER_LINEAR)
# 2.2 相对尺寸
img2=cv2.resize(img,dsize=None,fx=0.8,fy=0.6)
#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('juedui',img1)
cv2.imshow('xiangdui',img2)
cv2.waitKey(0)
先放大再旋转和先旋转再放大的操作,得到的结果是相同的;先放大在平移和先平移在放大的操作,得到的结果是不一致的。
定义: 图像仿射变换是深度学习预处理中常用的功能,仿射变换主要对图像的缩放、旋转、翻转和平移等操作的组合.
API:
M=cv2.getAffineTransform(pts1,pts2)
cv2.warpAffine(img,M,dsize)
参数:
pts1:原图中的三个点
pts1:变换后的三个点
注意:仿射变换中,原图中所有不平先线在结果图像中同样平行。为了进行仿射变换,首先需要找到原图中三个点,以及仿射变换后的三个点,利用这两组点以及cv2.getAffineTransform()函数,求取2×3的仿射变换矩阵;之后仿射变换矩阵传入cv2.wrapAffine()函数,进行仿射变换。仿射变换的特点是,点线之间的关系在在原图中是一样的,但线的长度会发生变换、线与线之间的角度也会发生变化。
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('view.png')
#2. 图像仿射变换
print(img.shape)#(271, 271, 3)
##2.1 放射变换矩阵
pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[100,100],[200,50],[50,200]])
M=cv2.getAffineTransform(pts1,pts2)
##2.2 仿射变换
img2=cv2.warpAffine(img,M,(271, 271))
#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('fangshe',img2)
cv2.waitKey(0)
定义: 透射变换是视角变换的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透射轴)旋转某一角度,破坏原有的投影光束线,仍能保持承影面上投影几何图像不变的变换。
API:
T=cv2.getPerspectiveTransform(pts1,pts2)
cv2.warpPerspective(img,T,dsize)
参数:
pts1:原图中的四个点
pts2:透射变换后的四个点
注意:在OpenCV中,我们要找到四个点,其中任意三个不共线,然后通过四个点和cv2.getPerspectiveTransform()获取透射变换矩阵T,在利用T进行透射变换。
import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('view.png')
#2. 图像透射变换
print(img.shape)#(271, 271, 3)
##2.1 透射变换矩阵
pts1=np.float32([[56,65],[268,42],[28,187],[189,190]])
pts2=np.float32([[100,145],[200,100],[80,190],[210,200]])
T=cv2.getPerspectiveTransform(pts1,pts2)
##2.2 透射变换
img2=cv2.warpPerspective(img,T,(271, 271))
#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('toushe',img2)
cv2.waitKey(0)
差值:
(1)最近邻差值:就是用最邻近的点的灰度值的拷贝,但是这种方式不真实,容易产生梯田效应。
(2)线性差值:在差值的点和周围的点之间形成一个正方形,正方形中根据距离设定权重,计算灰度值叠加作为差值点的灰度值。
(3)双线性差值