Descriptor local de imagen: descriptor SIFT y detección de esquina de Harris

Introducción

El algoritmo de detección de esquinas de Harris es uno de los métodos de detección de esquinas más simples, por lo que existen muchos inconvenientes. Con la investigación continua de los investigadores científicos y la propuesta del método SIFT, puede describir mejor las características de la imagen sobre la base original y puede hacer coincidir los descriptores con mayor precisión. Sin embargo, si desea lograr una coincidencia de características de imagen en el estado más ideal, el algoritmo SIFT por sí solo no es suficiente. Todavía necesitamos optimizar e innovar algoritmos a través de la investigación científica continua para finalmente lograr una coincidencia de puntos de características de imagen más eficiente y precisa.

1. Detección de esquinas

Primero, veamos la detección de esquinas de Harris. El detector de esquinas de Harris puede dar los puntos de interés detectados en la imagen. El código y los resultados son los siguientes:

from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

# 读入图像
im = array(Image.open(r'C:\Users\18042\Desktop\img1.jpg').convert('L'))

# 检测harris角点
harrisim = harris.compute_harris_response(im)

# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(121)
imshow(im)
axis('off')
axis('equal')

threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
    filtered_coords = harris.get_harris_points(harrisim, 6, thres)

subplot(1, 2, 2)
imshow(im)
print (im.shape)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')

show()

Imagen original: img1.jpg
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

A juzgar solo por los resultados de la inspección, parece ser bastante bueno, y la mayoría de los puntos de esquina son básicamente reconocidos. Pero si comparamos el resultado con la función SIFT, podemos ver que la detección de esquinas de Harris sigue siendo ligeramente inferior a SIFT:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

imname = r'C:\Users\18042\Desktop\img1.jpg'
im = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'empire.sift')
l1, d1 = sift.read_features_from_file('empire.sift')

figure()
gray()
subplot(131)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征',fontproperties=font)
subplot(132)
sift.plot_features(im, l1, circle=True)
title(u'用圆圈表示SIFT特征尺度',fontproperties=font)

# 检测harris角点
harrisim = harris.compute_harris_response(im)

subplot(133)
filtered_coords = harris.get_harris_points(harrisim, 6, 0.1)
imshow(im)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
title(u'Harris角点',fontproperties=font)

show()

Inserte la descripción de la imagen aquí

Análisis de resultados

A partir de los resultados, podemos ver claramente que el reconocimiento de la característica SIFT es más fuerte que los puntos de esquina de Harris. Por ejemplo, el SIFT en el medio del edificio en la figura se puede reconocer bien, pero los puntos de pie de Harris no se pueden reconocer. Esto se debe precisamente a que el principio del algoritmo es diferente, lo que conduce a resultados diferentes. La detección de pie de Harris se basa principalmente en los valores propios de la matriz de Harris en los tres casos que se muestran en la siguiente figura. La detección de puntos de pie es no es significativo en un área determinada. La detección del punto de pie no se puede realizar bien en el caso de , y la función SIFT extrae características al encontrar la ubicación precisa y la dirección principal de puntos extremos (puntos de características, puntos clave) en diferentes espacios de escala, y la construcción de descriptores de puntos clave. La transformación en espacios de diferentes escalas resuelve el problema del reconocimiento poco claro de áreas pequeñas .
Inserte la descripción de la imagen aquí

2. Coincidencia de puntos característicos

Primero, veamos los resultados de emparejar a través de los pies de Harris:

from pylab import *
from PIL import Image

from PCV.localdescriptors import harris
from PCV.tools.imtools import imresize

im1 = array(Image.open(r'C:\Users\18042\Desktop\img1.jpg').convert("L"))
im2 = array(Image.open(r'C:\Users\18042\Desktop\img2.jpg').convert("L"))

im1 = imresize(im1, (im1.shape[1], im1.shape[0]))
im2 = imresize(im2, (im2.shape[1], im2.shape[0]))

wid = 5
harrisim = harris.compute_harris_response(im1, 5)
filtered_coords1 = harris.get_harris_points(harrisim, wid+1)
d1 = harris.get_descriptors(im1, filtered_coords1, wid)

harrisim = harris.compute_harris_response(im2, 5)
filtered_coords2 = harris.get_harris_points(harrisim, wid+1)
d2 = harris.get_descriptors(im2, filtered_coords2, wid)

print ('starting matching')
matches = harris.match_twosided(d1, d2)

figure()
gray() 
harris.plot_matches(im1, im2, filtered_coords1, filtered_coords2, matches)
show()

Inserte la descripción de la imagen aquí

Análisis de resultados de Harris

Aquí damos dos imágenes similares, pero seguimos haciendo coincidir con una imagen tomada moviéndonos ligeramente hacia la derecha. Hay muchos puntos en la imagen que pueden coincidir, pero encontraremos que hay algunas discrepancias, como en la figura, los puntos de la capa superior de nubes coinciden con los puntos de abajo. Si cambia la imagen y hace coincidir dos imágenes que no son una escena en absoluto, encontraremos la seriedad del asunto, como se muestra a continuación:

Inserte la descripción de la imagen aquí
Dos imágenes irrelevantes tienen tantos valores coincidentes en la coincidencia de puntos de referencia de Harris. Parece que el algoritmo de Harris sigue siendo el octavo Taihang. Por el contrario, mire SIFT:

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift


if len(sys.argv) >= 3:
  im1f, im2f = sys.argv[1], sys.argv[2]
else:
  im1f = r'C:\Users\18042\Desktop\img1.jpg'
  im2f = r'C:\Users\18042\Desktop\img2.jpg'
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))

sift.process_image(im1f, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)

sift.process_image(im2f, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)

#matches = sift.match(d1, d2)
matches = sift.match_twosided(d1, d2)
print ('{} matches'.format(len(matches.nonzero()[0])))

figure()
gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
show()

Inserte la descripción de la imagen aquí

Análisis de resultados de SIFT

Podemos ver que casi no hay desajustes para imágenes similares, y solo algunas características repetitivas en los edificios no coinciden, lo cual es inevitable.
Inserte la descripción de la imagen aquí
Y para imágenes tan irrelevantes, SIFT no tendrá muchos puntos de coincidencia inexplicables como Harris.

Al mismo tiempo, debido a las características de SIFT, los descriptores de puntos clave se construyen para extraer características al encontrar el posicionamiento preciso y las direcciones principales de puntos extremos (puntos de características, puntos clave) en diferentes espacios de escala. Los puntos clave extraídos por SIFT tienen invariancia de escala e invariancia de rotación, y la coincidencia de características se puede realizar bien en el caso de grandes diferencias de brillo , lo que no se compara con la detección de ángulo de Harris.
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Como se muestra en la figura siguiente : Como se muestra en la figura anterior, podemos ver directamente las características de SIFT y tener una buena sensibilidad al ángulo de brillo de rotación y la escala de la imagen. Pero al mismo tiempo, también encontré algunos problemas durante la prueba.
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

Como se muestra en la figura, los resultados de la coincidencia de funciones de SIFT en imágenes desde diferentes ángulos de disparo son extremadamente pobres . Sólo se pueden emparejar con éxito algunos puntos de características, e incluso ningún punto de características se puede emparejar con éxito. Aunque SIFT puede igualar bien las rotaciones de imágenes bidimensionales, las imágenes tomadas desde diferentes ángulos no pueden coincidir con precisión después de las rotaciones tridimensionales. Por lo tanto, aunque SIFT es mejor que la detección de esquinas de Harris, todavía existen problemas ¡El algoritmo también se puede optimizar para obtener un algoritmo de coincidencia de puntos característicos más preciso y potente!

3. Coincidencia de imágenes geoetiquetadas

# -*- coding: utf-8 -*-
import json
import os
import urllib
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot
import os
os.environ["PATH"] += os.pathsep + 'D:/Graphviz/bin'

if __name__ == '__main__':
    download_path = r"C:\Users\18042\Desktop\32Vision\img"
    path = r"C:\Users\18042\Desktop\32Vision\img"

    imlist = imtools.get_imlist(download_path)
    nbr_images = len(imlist)

    featlist = [imname[:-3] + 'sift' for imname in imlist]
    for i, imname in enumerate(imlist):
        sift.process_image(imname, featlist[i])

    matchscores = zeros((nbr_images, nbr_images))

    for i in range(nbr_images):
        for j in range(i, nbr_images):  # only compute upper triangle
            print('comparing ', imlist[i], imlist[j])
            l1, d1 = sift.read_features_from_file(featlist[i])
            l2, d2 = sift.read_features_from_file(featlist[j])
            matches = sift.match_twosided(d1, d2)
            nbr_matches = sum(matches > 0)
            print('number of matches = ', nbr_matches)
            matchscores[i, j] = nbr_matches

    # copy values
    for i in range(nbr_images):
        for j in range(i + 1, nbr_images):  # no need to copy diagonal
            matchscores[j, i] = matchscores[i, j]

    # 可视化
    threshold = 2  # min number of matches needed to create link

    g = pydot.Dot(graph_type='graph')  # don't want the default directed graph

    for i in range(nbr_images):
        for j in range(i + 1, nbr_images):
            if matchscores[i, j] > threshold:
                # first image in pair
                im = Image.open(imlist[i])
                im.thumbnail((100, 100))
                filename = path + str(i) + '.jpg'
                im.save(filename)  # need temporary files of the right size
                g.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))

                # second image in pair
                im = Image.open(imlist[j])
                im.thumbnail((100, 100))
                filename = path + str(j) + '.jpg'
                im.save(filename)  # need temporary files of the right size
                g.add_node(pydot.Node(str(j), fontcolor='transparent', shape='rectangle', image=filename))

                g.add_edge(pydot.Edge(str(i), str(j)))
    g.write_jpg('outimg.jpg')

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_43605229/article/details/115112809
Recomendado
Clasificación