计算机视觉

Python实现图像全景拼接

目标:将数张有重叠部分的图像通过特征点检测,匹配,图像变换拼成一幅无缝的全景图或高分辨率图像 在图像拼接中首先利用SIFT算法提取图像特征进而进行特征匹配,继而使用RANSAC算法对特征匹配的结果进行优化,接着利用图像变换结构进行图像映射,最终进行图像融合。 在图像拼接过程中,运用SIFT局部描述算子检测图像中的关键点和特征,SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高,所以用来检测要拼接图像的特征及关键点就很有优势。而接下来即步骤三是找到重叠的图片部分,连接所有图片之后就可以形成一个基本的全景图了。匹配图片最常用的方式是采用RANSAC(RANdom SAmple Consensus, 随机抽样一致),用此排除掉不符合大部分几何变换的匹配。之后利用这些匹配的点来估算单应矩阵”(Homography Estimation),也就是将其中一张图像通过关联性和另一张匹配。 使用的算法: RANSAC SIFT 1. 利用SIFT方法检测特征点 def detectAndDescribe(image): # 将彩色图片转换成灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 建立SIFT生成器 descriptor = cv2.xfeatures2d.SIFT_create() # 检测SIFT特征点,并计算描述子 (kps, features) = descriptor.

图像分割(Segmentation)——K-Means, 最小割, 归一化图割

图像分割是将图片将相似的部分分割成相同的块 Gestalt理论 解释物体分割的底层原理 将同一个东西群组在一起,集合中的元素可以具有由关系产生的属性 Gestalt中常见的一些分组的情况 现实生活中的分组现象 将这种思想转化为算法 K-Means聚类 主要思想:相似的像素应该属于同一类 像素表达:每个像素可以使用一个多维向量来表示,如(R, G, B)的三维向量,(R, G, B, x, y)的五维向量 K-Means算法: “物以类聚、人以群分”: 首先输入k的值,即我们希望将数据集经过聚类得到k个分组。 从数据集中随机选择k个数据点作为初始大哥(质心,Centroid) 对集合中每一个小弟,计算与每一个大哥的距离(距离的含义后面会讲),离哪个大哥距离近,就跟定哪个大哥。 这时每一个大哥手下都聚集了一票小弟,这时候召开人民代表大会,每一群选出新的大哥(其实是通>过算法选出新的质心)。

python实现Canny与Hough算法

任务说明:编写一个钱币定位系统,其不仅能够检测出输入图像中各个钱币的边缘,同时,还能给出各个钱币的圆心坐标与半径。 效果 代码实现 Canny边缘检测: # Author: Ji Qiu (BUPT) # filename: my_canny.py import cv2 import numpy as np class Canny: def __init__(self, Guassian_kernal_size, img, HT_high_threshold, HT_low_threshold): ''' :param Guassian_kernal_size: 高斯滤波器尺寸 :param img: 输入的图片,在算法过程中改变 :param HT_high_threshold: 滞后阈值法中的高阈值 :param HT_low_threshold: 滞后阈值法中的低阈值 ''' self.

纹理表示(Texture)

纹理是由一些基元以某种方式组合起来,虽然看起来很“乱”,但任然存在一些规律 规则的纹理与不规则的纹理 纹理描述 使用高斯偏导核,对图像进行卷积,x方向的偏导得到的是竖直纹理,y方向的偏导得到的是水平纹理 统计各个方向的纹理数量,在图中表示出来,不同的区域映射的是不同的纹理特性 如下图所示进行K均值聚类 距离显示了窗口a的纹理和窗口b的纹理有多么不同。 对于区块核大小的选择 在图像中往往不知道选取多大的高斯偏导核来对图像进行描述 通过寻找纹理描述不变的窗口比例来进行比例选择,由小到大不断改变窗口的大小,直至增大的窗口纹理特性不再改变 滤波器组 可以描述不同方向,不同类型(边状,条状,点)的纹理特性 通过设置斜方差矩阵$\Sigma$,改变高斯核的形状 利用不同的核卷积图像

区域检测——Blob & SIFT

针对Harris无法拟合尺度问题而提出 目标:独立检测同一图像缩放版本的对应区域 需要通过尺度选择机制来寻找与图像变换协变的特征区域大小 “当尺度改变时控制每个圆内的内容不变” Laplacian核 具体的算法是在边缘检测中使用的高斯一阶偏导核转换为高斯二阶偏导核 使用Laplacian核与图像进行卷积操作 **边缘:**出现波纹的地方 **尺度信息:**当波纹重叠并出现极值的地方 空间选择:如果Laplacian的尺度与blob的尺度“匹配”,则Laplacian响应的幅度将在blob的中心达到最大值 在实际运用的过程中是使用模板匹配信号,即不断改变Laplacian的参数$\sigma$取处理后的结果达到峰值时的$\sigma$,随着参数的增大会导致后面的特征消失(高斯偏导的面积公式中的$\sigma$在分母) 为了保持响应不变(尺度不变),必须将高斯导数乘以$\sigma$ 拉普拉斯导数是二阶高斯导数,所以它必须乘以$\sigma^2$ 二维空间的Blob的检测 高斯的拉普拉斯算子:用于二维检测的圆对称算子 $$\nabla^2 g=\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2}\Longrightarrow \nabla_{norm}^2 g=\sigma^2(\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2})$$ Laplcain算子中的$\sigma$与检测对象画出的圆的半径$r$的关系 为了得到最大响应,Laplacian的零点必须与圆对齐 令:$$\nabla_{norm}^2 g=0即:\sigma^2(\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2})=0$$ 化简后: $$ (x^2+y^2-2\sigma^2)e^{-\frac{x^2+y^2}{2\sigma^2}}=0 $$

区域检测——Harris角点

对于图像处理时经常需要提取特征点分析图片结构,将照片进行拼接,实现全景拍摄,那么在照片特征点提取时所采用的具体算法是什么呢? 解决思路 提取特征点 匹配特征点 使用RANSAC方法将两张图片的对应的特征点转换的方式拟合出来,在对图片采用相同的转换方式进行转换,在进行拼接 特征点——Corner 好的特征点是什么样的? 可重复性:在一张图可以被观测到的,在其他同场景的图也可以被观测到 显著性:检测的特征点需要是在某一类图像中“独有的”,尽量剔除“普遍性”的点,目的是为了将不同类的图区分开 简洁和高效:尽可能的减少计算量,提高计算效率 局部性:匹配特征时要匹配特征点之间的相对关系,通过局部特征相对位置来判断是否为同一张图,来拟合转动镜头角度,图像位置 什么样的点满足条件 通过观察图片的特征,发现存在“角”的地方承载着更多的信息,角点是梯度在两个或以上方向上有变化的点。 Basic Idea 使用一个较小的窗口在图像上延各个方向滑动 不同的变化趋势显示了不同的特征 图像内部所在的窗口延各个方向都没有变化;边缘所在的窗口延边缘方向无变化;角点所在窗口会在各个方向上都有显著的变化 数学描述 $u$和$v$是平移量 求平移后的窗口与平移前的窗口的对应位置差的平方,再累加 乘上窗口权重,考虑每个点对窗口影响的不同程度,例如第二种的高斯函数权重,就是考虑中间的点的差值在整个窗口的影响度更大 二阶泰勒展开:为了能够直接观察到$E(u,v)$与$[u,v]$之间的联系 取$E(u,v)$在$(0,0)$的二阶展开作为近似解

拟合(Fitting)

提取完边缘后如何使用数学模型来描述边缘? 例如:在桌子上有几枚硬币,在经过边缘提取后,需要描述出硬币的圆心坐标和圆的大小 难点 噪声:噪声的存在使拟合的模型偏离真实的线 外点:在目标图形以外的线,如上图中的目标图形为“车”,左边的“栅栏”就是外点 目标图形部分被遮挡,使部分图形消失 最小二乘(Least Square) 针对点都在线上的一些简单模型 最小二乘 能量函数$E$描述的是所有的点与拟合的线在$y$方向上的差值的和,最后的目标是求出差值最小时的$(m,b)$即矩阵$B$作为这个模型的解 权最小二乘 当拟合的直线是平行$y$轴时就无法按照上面的公式计算$E$(最小二乘对旋转没有效果) 权最小二乘将点在$y$方向的距离改为对直线距离的平方,就可以避免旋转产生的问题 ,它的几何描述就是所有的向量$(x_i-\bar x,y_i-\bar y)$在向量$(a,b)$的投影的值最小 极大似然估计 使用概率分布的思想来理解权最小二乘,概率越大拟合效果越好,极大似然估计,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值,它提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。 如果通过极大似然估计,得到模型中参数$\mu$和$\sigma$的值,那么这个模型的均值和方差以及其它所有的信息我们就知道了。

边缘检测(Edge Detection)

边缘提取 在大多数时候图像的边缘可以承载大部分的信息,并且提取边缘可以除去很多干扰信息,提高处理数据的效率 目标 识别图像中的突然变化(不连续) 图像的大部分语义信息和形状信息都可以编码在边缘上 理想:艺术家使用线条勾勒画(但艺术家也使用对象层次的知识) 边缘的种类 表面形状的突变 深度方向的不连续 表面颜色的突变 光线阴影的不连续 边缘的特征 边缘是图像强度函数中快速变化的地方,变化的地方就存在梯度,对灰度值求导,导数为0的点即为边界点 卷积的导数 偏导数公式: $$\frac {\partial f(x,y)}{\partial x} = \lim_{\varepsilon \rightarrow 0} \frac{f(x+\varepsilon ,y)-f(x,y)}{\varepsilon}$$

高驱动注意网络(HANET)

PAPER: Cars Can’t Fly up in the Sky: Improving Urban-Scene Segmentation via Height-driven Attention Networks CityScape数据集 介绍 ​Cityscapes是关于城市街道场景的语义理解图片数据集。它主要包含来自50个不同城市的街道场景,拥有5000张在城市环境中驾驶场景的高质量像素级注释图像(其中 2975 for train,500 for val,1525 for test, 共有19个类别);此外,它还有20000张粗糙标注的图像(gt coarse)。

半监督深度学习

半监督学习 在有标签数据+无标签数据混合成的训练数据中使用的机器学习算法。一般假设,无标签数据比有标签数据多,甚至多得多。 要求: 无标签数据一般是有标签数据中的某一个类别的(不要不属于的,也不要属于多个类别的); 有标签数据的标签应该都是对的; 无标签数据一般是类别平衡的(即每一类的样本数差不多); 无标签数据的分布应该和有标签的相同或类似 。 半监督学习算法 简单自训练(simple self-training):用有标签数据训练一个分类器,然后用这个分类器对无标签数据进行分类,这样就会产生伪标签(pseudo label)或软标签(soft label),挑选认为分类正确的无标签样本(此处应该有一个挑选准则),把选出来的无标签样本用来训练分类器 协同训练(co-training):是 self-training 的一种,但其思想是好的。假设每个数据可以从不同的角度(view)进行分类,不同角度可以训练出不同的分类器,然后用这些从不同角度训练出来的分类器对无标签样本进行分类,再选出认为可信的无标签样本加入训练集中。由于这些分类器从不同角度训练出来的,可以形成一种互补,而提高分类精度;就如同从不同角度可以更好地理解事物一样。 半监督字典学习:是 self-training 的一种,先是用有标签数据作为字典,对无标签数据进行分类,挑选出认为分类正确的无标签样本,加入字典中(此时的字典就变成了半监督字典了)