SIFT简单介绍
能够配合不同的兴趣点检测器,使用包含位置、尺度和方向信息的描述子
检测兴趣点
将图片转换为.pgm格式,并转换为二进制文件。
def process_image(imagename,resultname,
params="--edge-thresh 10 --peak-thresh 5"):
""" 处理一幅图像,然后将结果保存在文件中 """
if imagename[-3:] != 'pgm':
#创建一个pgm文件
im = Image.open(imagename).convert('L')
im.save('tmp.pgm')
imagename = 'tmp.pgm'
cmmd = str(r"\Code\sift.exe " + imagename + " --output=" + resultname +
" " + params)
os.system(cmmd)
print("processed",imagename,"to",resultname)
return
此处注意sift.exe文件的位置。
在刚刚创建的二进制文件中应当包含描述子的信息,下面将文件读取到numpy数组中。
#将描述兴趣点的文本文件读取到Numpy的数组中
def read_features_from_file(filename):
""" 读取特征属性值,然后将其以矩阵的形式返回 """
f = loadtxt(filename)
return f[:,:4], f[:,4:] #特征位置,描述子
这样我们就得到了兴趣点的描述子,可以将其可视化。
#在图像上绘制出特征位置
##将参数 circle 的选项设置为 True
## 该函数将使用 draw_circle() 函数绘制出圆圈
## 圆圈的半径为特征的尺度。
def plot_features(im,locs,circle=False):
""" 显示带有特征的图像
输入: im(数组图像), locs(每个特征的行、列、尺度和朝向) """
def draw_circle(c,r):
t = arange(0,1.01,.01)*2*pi
x = r * cos(t) + c[0]
y = r * sin(t) + c[1]
plot(x,y,"b",linewidth = 2)
imshow(im)
if circle:
for p in locs:
draw_circle(p[:2],p[2]