opencv

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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值