cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像
每一个像素点的值是由0-255组成的。(一般都是RGB三颜色通道组成的)
将图片输入进计算机,将图片转换成像素矩阵的形式。
将输出图像的过程定义为一个函数。
这样输出的形式就是像素矩阵形式,并输出一个图片。
在waitkey括号里面的数字表示等待关闭的毫秒数,当数字为0的时候,输入任意键可关闭窗口。
直接用shape语句可以获得图像的属性。
.size可以查出图像的大小,dtype可以查询图片的类型。
可以改变固定大小,在不知道要改多大的时候也可以使用方所的功能。
Canny边缘检测
①使用高斯滤波器,以平滑图像,滤除噪声。
②计算图像中每个像素点的梯度强度和方向。
③应用非极大值抑制,以消除边缘检测带来的杂散相应
④应用双阈值检测来确定真实的和潜在的边缘。
⑤通过抑制孤立的弱边缘最终完成边缘检测。
1.使用高斯滤波器
2.梯度和方向
3.非极大值抑制
线性差值法非常繁琐,所以通常使用下列方法。
如果A的值比B比C的值都大,就把A的值保留下来,求得A的边界。
4.双阈值检测
如果minval设置的过低,会获取过多的边缘。(maxval同理)
如果minval设置的过高,会获取较少的边缘。(maxval同理)
图像金字塔
高斯金字塔和拉普拉斯金字塔。
图像变大是上采样,图像变小是下采样。
图像轮廓
一般情况下都使用RETR_TREE
不断用线段来取轮廓近似。
模版匹配
找到图像中区域与模板最相近的部分。
模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,之后将每次计算的结果放入一个矩阵里,作为结果输出。加入原图形是A×B大小,而模板是a×b大小,则输出结果的矩阵是
(A-a+1)×(B-b+1)
图像特征-harris角点检测
判断平移后的自相似性(求矩阵特征值)
因为对角线相等,所以是一个实对称阵,一定能找到N个单位特征向量,使得它能够进行对角化操作。
c(x,y···)近似为一个椭圆
通过一定方式将椭圆扭过来。
比较特征值大小
边界:λ1和λ2可以理解成一个椭圆的长轴和短轴(不区别)。如果在一个轴上变化很大,在另一个边界上变化很小,那么久说明这是一个边界。
平面:两个特征值都小,且近似相等;自相关函数数值在各方向上都比较小。
角点:两个特征值都大,且近似相等,自相关函数在所有方向都增大。
角点相应R值:
R=detM-α(traceM)^2
detM=λ_{1} λ_{2} traceM=λ_{1} +λ_{2}
R值比较小(接近于0)的话就是接近平坦的区域。
R值如果<0的话,就是边界。
R值如果>0的话,就是角点。
通常情况下再加一个NMS(非极大值抑制),将有用的角点留下来,将不是角点的过滤掉。
cv2.cornerHarris程序
import cv2
import numpy as np
#读入数据的类型只能是float32的图像
#如果是特别的数据格式 需要使用gray = np.float32(gray)
#cvtColor(数据,)
#blockSize:角点检测中指定区域的大小
#ksize:Sobel求导中使用的窗口大小
#k:取值参数为[0.04,0.06]
img = cv2.imread(‘7.jpg’)
print(‘img.shape:’,img.shape)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, 10,3, 0.04)
print(‘dst.shape:’,dst.shape)
#在求导中大于最大值得0.01倍,把所有判断为true的点标记为[0,0,255]
img[dst>0.1*dst.max()]=[0,0,255]
cv2.imshow(‘dst’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Scale Invariant Feature Transform(SIFT)
一、图像尺度空间
在一定的范围内,无论物体是大还是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难,所以要让机器能够对物体在不同尺度下有一个统一的认知,就需要考虑图像在不同尺度下都存在的特点。
尺度空间的获取通常使用高斯模糊来实现。
L(x,y,\sigma )=G(x,y,\sigma )*I(x,y)
其中G是高斯函数
G(x,y,\sigma )=\frac{1}{2\pi \sigma ^2 } e\frac{x2+y^2 }{2 \sigma ^2 }
\sigma 控制卷积核的数值,\sigma 越大标准差就越大,对图像改变的就越大,原图像就越模糊。
多分辨率金字塔
在图像尺度空间一共做了两件事,可以将一张图做多张高斯滤波变换的图。
高斯差分金字塔(DOG)
将图像进行差分,得到四个结果,用来观察点,找特征点,接着用一个特征向量进行代替。
(差分完以后会得到差异性结果)
DOG公式
D(x,y,\sigma)=[G(x,y,k\sigma)-G(x,y,\sigma)]*I(x,y)=L(x,y,k\sigma)-L(x,y,\sigma)
x,y表示该特征点的空间位置,\sigma表示高斯模糊的参数。
极值检测
在比较的时候不光跟自身这一层的比较,还需要跟上下两层的周围的点去比较,也就是每个每个点都和周围26个点进行比较。
关键点的精确定位
这些候选关键点是DOG空间的局部极值点,而且这些极值点均为离散的点,精确定位极值点的一种方法是,对尺度空间DOG函数进行曲线拟合,计算极值点,从而实现关键点的精确定位。(可以认为是微调,也可以认为是一定条件下的拟合)
利用泰勒级数进行展开
f(x)≈f(0)+f`(0)x+\frac{f``(0)}{2} x^2
消除边界影响:
主曲率比值\gamma =\frac{α}{β} >10的特征点将被删除
特征点的主方向
每个点L(x,y)的梯度的模m(x,y)以及方向θ(x,y):
m(x,y)=\sqrt{[L(x+1,y)-L(x-1,y)]2+L(x,y+1)-L(x,y-1)]2 }
生成特征描述
在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。
标注了方向和方向的大小,右侧的就是直方图,为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ角度,即将坐标轴旋转为特征点的主方向。
旋转之后的主方向为中心取8×8的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后再每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,即每个特征的由4个种子点组成,每个种子点有8个方向的向量信息。
SIFT代码
import cv2
import numpy as np
img = cv2.imread(‘1.jpg’)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#讲SIFT代表实例化
sift = cv2.xfeatures2d.SIFT_create()
#kp就是keypoints,就是得到一些关键点
kp = sift.detect(gray,None)
#使用drawkeypoints将kp画出来
img = cv2.drawKeypoints(gray,kp,img)
img = cv2.resize(img,(0,0),fx=0.3,fy=0.3)
cv2.imshow(‘drawkeypoints’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#计算特征
kp, des = sift.compute(gray, kp)
#打印关键点个数
print(np.array(kp).shape)
#打印维度,证明每个关键点都转化为128维的向量了
print(des.shape)
如果用opencv加载一个深度学习模型
cv2.dnn.readNetFromTorch是可以将一个模型架构还有网络模型中所有的参数读进来。
1.resize
2.减均值
3.预处理
#imge,scalefactor(1是不变的),size,mean swapRB
blob = cv2.dnn.blobFromImage(resize,1,(224, 224),(104,117,123))