python2.7图像局部增强_Python图像局部特征提取
图像特征能够包罗颜色特征、纹理特征、外形特征以及局部特征点等。个中局部特点具有很好的不乱性,不轻易受外界情况的干扰。图像特征提取是图像剖析与图像识其余前提,它是将高维的图像数据进行简化表达最有效的体式,从一幅图像的的数据矩阵中,我们看不出任何信息,所以我们必需凭据这些数据提掏出图像中的要害信息,一些根基元件以及它们的关系。
图像局部特征描述的焦点问题是不变性(鲁棒性)和可区分性。因为使用局部图像特征描述子的时候,平日是为了鲁棒地处理各类图像变换的情形。是以,在构建/设计特征描述子的时候,不变性问题就是首先需要考虑的问题。在宽基线成家中,需要考虑特征描述子对于视角转变的不变性、对标准转变的不变性、对扭转转变的不变性等;在外形识别和物体检索中,需要考虑特征描述子对外形的不变性。
局部特征点是图像特征的局部表达,它只能回响图像上具有的局部特别性,所以它只适合于对图像进行成家,检索等应用。对于图像懂得则不太适合。尔后者更关心一些全局特征,如颜色分布,纹理特征,首要物体的外形等。全局特征轻易受到情况的干扰,光照,扭转,噪声等晦气身分都邑影响全局特征。比拟而言,局部特征点,往往对应着图像中的一些线条交叉,明暗转变的构造中,受到的干扰也少。
对于局部特征的检测,平日使用局部图像描述子来进行。
黑点与角点是两类局部特征点。黑点平日是指与四周有着颜色和灰度不同的区域,如草原上的一棵树或一栋房子。它是一个区域,所以它比角点的抗噪能力要强,不乱性要好。而角点则是图像中物体的拐角或许线条之间的交叉部门。
黑点检测道理与举例
LoG与DoH
黑点检测的方式首要包罗行使高斯拉普拉斯算子检测的方式(LOG),以及行使像素点Hessian矩阵(二阶微分)及其队列式值的方式(DOH)。
DoH方式就是行使图像点二阶微分Hessian矩阵, Hessian矩阵队列式的值,同样也反映了图像局部的构造信息。与LoG比拟,DoH对图像中的颀长构造的黑点有较好的按捺感化。
无论是LoG照样DoH,它们对图像中的黑点进行检测,其步伐都能够分为以下两步:
使用分歧的生成或模板,并对图像进行卷积运算;
在图像的位置空间与标准空间中搜刮LoG与DoH响应的峰值。
SIFT(标准不变特征变换)
标准不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间标准中寻找极值点,并提掏出其位置、标准、扭转不变量。该描述子具有非常强的稳健性。
SIFT算法具体介绍
SIFT算法步伐构建DOG标准空间
模拟图像数据的多标准特征,大标准抓住概貌特征,小标准留意细节特征。经由构建高斯金字塔(每一层用分歧的参数σ
σ做高斯恍惚(加权)),包管图像在任何标准都能有对应的特征点,即包管标准不变性。要害点搜刮和定位:
确定是否为要害点,需要将该点与同标准空间分歧σ
σ值的图像中的相邻点对照,若是该点为max或min,则为一个特征点。找到所有特征点后,要去除低对比度和不不乱的边缘效应的点,留下具有代表性的要害点(好比,正方形扭转后变为菱形,若是用边缘做识别,4条边就完全纷歧样,就会错误;若是用角点识别,则不乱一些)。去除这些点的优点是增加成家的抗噪能力和不乱性。最后,对离散的点做曲线拟合,获得正确的要害点的位置和标准信息。偏向赋值为了实现扭转不变性,需要凭据检测到的要害点的局部图像构造为特征点赋值。具体做法是用梯度偏向直方图。在较量直方图时,每个到场直方图的采样点都使用圆形高斯函数进行加权处理,也就是进行高斯腻滑。这首要是因为SIFT算法只考虑了标准和扭转不变形,没有考虑仿射不变性。经由高斯腻滑,能够使要害点四周的梯度幅值有较大权重,从而部门填补没考虑仿射不变形发生的特征点不不乱。注重,一个要害点或者具有多个要害偏向,这有利于增加图像成家的鲁棒性。要害点描述子生成
要害点描述子不只包罗要害点,还包罗要害点四周对其有进献的像素点。如许可使要害点有更多的不变特征,提高方针成家效率。在描述子采样区域时,需要考虑扭转后进行双线性插值,防止因扭转图像显现白点。同时,为了包管扭转不变性,要以特征点为中心,在四周范畴内扭转θ
θ角,然后较量采样区域的梯度直方图,形成n维SIFT特征矢量(如128-SIFT)。最后,为了去除光照转变的影响,需要对特征矢量进行归一化处理。
SIFT特征提取的长处
SIFT特征是图像的局部特征,其对扭转、标准缩放、亮度转变连结不变性,对视角转变、仿射变换、噪声也连结必然水平的不乱性;
奇特性(Distinctiveness)好,信息量雄厚,适用于在海量特征数据库中进行快速、正确的成家;
多量性,即使少数的几个物体也能够发生大量的SIFT特征向量;
高速性,经优化的SIFT成家算法甚至能够达到实时的要求;
可扩展性,能够很轻易的与其他形式的特征向量进行结合;
需要较少的经验主义常识,易于斥地。
SIFT特征提取的瑕玷
实时性不高,因为要络续地进行下采样和插值等把持;
有时特征点较少(好比恍惚图像);
对边缘圆滑的方针无法正确提取特征(好比边缘腻滑的图像,检测出的特征点过少,对圆更是力所不及)。
SIFT特征提取能够解决的问题
方针的自身状况、场景所处的情况和成像器材的成像特征等身分影响图像配准/方针识别跟踪的机能。而SIFT算法在必然水平上可解决:
方针的扭转、缩放、平移(RST)
图像仿射/投影变换(视点viewpoint)
光照影响(illumination)
方针遮挡(occlusion)
杂物场景(clutter)
噪声
角点检测的道理与举例
角点检测的方式也是极多的,个中具有代表性的算法是Harris算法与FAST算法。
算法道理详解:Harris特征点检测,FAST特征检测
Harris角点特征提取
Harris角点检测是一种基于图像灰度的一阶导数矩阵检测方式。检测器的首要思惟是局部自相似性/自相关性,即在某个局部窗口内图像块与在各个偏向微小移动后的窗口内图像块的相似性。该算法认为像素四周显露存在多余一个偏向的边,便认为该点为乐趣点,即称为角点。
Harris算法步伐

Harris角点性质
2.该算法算子对亮度和对比度的转变不敏感。这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的举高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点显现的位置,然则,因为阈值的选择,或者会影响角点检测的数量。
2.算子具有扭转不变性。Harris角点检测算子使用的是角点四周的区域灰度二阶矩矩阵。而二阶矩矩阵能够透露成一个椭圆,椭圆的长短轴恰是二阶矩矩阵特征值平方根的倒数。当特征椭圆迁移时,特征值并不发生转变,所以判断角点响应值也不发生转变,由此解说Harris角点检测算子具有扭转不变性。
3.算子不具有标准不变性。
Harris算法实现import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from scipy.ndimage import filters
class Harris:
def init(self, img_path):
self.img_path = img_path
self.grayImg = None
self.Ix = None
self.Iy = None
self.Ix_mul_Ix = None
self.Ix_mul_Iy = None
self.Iy_mul_Iy = None
self.cim = None
self.filtered_coords = None
def _rgb2gray(self):
self.grayImg = Image.open(self.img_path).convert('L')
self.grayImg = np.array(self.grayImg)
def _cal_ix_iy(self, sigma=3):
较量导数
self.Ix = np.zeros(self.grayImg.shape)
filters.gaussian_filter(self.grayImg, (sigma, sigma), (0, 1), self.Ix)
self.Iy = np.zeros(self.grayImg.shape)
filters.gaussian_filter(self.grayImg, (sigma, sigma), (1, 0), self.Iy)
def _cal_para(self):
较量Ix2,Iy2和Ix*Iy并到场高斯滤波
self.Ix_mul_Ix = filters.gaussian_filter(self.Ix*self.Ix, 3)
self.Iy_mul_Iy = filters.gaussian_filter(self.Iy*self.Iy, 3)
self.Ix_mul_Iy = filters.gaussian_filter(self.Ix*self.Iy, 3)
def _cal_cim(self):
self.cim = (self.Ix_mul_Ixself.Iy_mul_Iy - 2self.Ix_mul_Iy) / (self.Ix_mul_Ix + self.Iy_mul_Iy)
def cal_harris(self, min_dist=10, threshold=0.1):
self._rgb2gray()
self._cal_ix_iy()
self._cal_para()
self._cal_cim()
conner_threshold = self.cim.max()*threshold
self.cim = (self.cim > conner_threshold)
coords = np.array(self.cim.nonzero()).T
candidate_values = [self.cim[c[0], c[1]] for c in coords]
index = np.argsort(candidate_values)
allowed_locations = np.zeros(self.cim.shape)
allowed_locations[min_dist:-min_dist, min_dist:-min_dist] = 1
self.filtered_coords = []
for i in index:
if allowed_locations[coords[i, 0], coords[i, 1]] == 1:
self.filtered_coords.append(coords[i])
allowed_locations[(coords[i, 0] - min_dist):(coords[i, 0] + min_dist),
(coords[i, 1] - min_dist):(coords[i, 1] + min_dist)] = 0 # 此处包管min_dist*min_dist只有一个harris特征点
return self.filtered_coords
def plot_harris_point(self):
plt.figure()
plt.gray()
plt.imshow(Image.open(self.img_path).convert('L'))
plt.plot([p[1] for p in self.filtered_coords], [p[0] for p in self.filtered_coords], '*')
plt.axis('off')
plt.show()
if name == 'main':
img_path = "./imgs/3.jpg"
harris = Harris(img_path)
harris.cal_harris()
harris.plot_harris_point()
究竟演示

