Usando Python para realizar la unión de imágenes

Uso del lenguaje python para lograr la unión de imágenes múltiples

Consulte principalmente la publicación de blog anterior, solo haga algunos complementos para resolver los pequeños problemas encontrados en el proceso de reproducción.

Procedimiento de costura:

from pylab import *
from numpy import *
from PIL import Image

# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

"""
This is the panorama example from section 3.3.
"""


featname = ['D:/pythonCode/test/data/testimages/' + str(i + 1) + '.sift' for i in range(5)]   //需要根据自己的图像地址和图像数量修改地址和循环次数
imname = ['D:/pythonCode/test/data/testimages/' + str(i + 1) + '.jpg' for i in range(5)]
# extract features and m
# match
l = {}
d = {}
for i in range(5):    //循环次数=图像数量
    sift.process_image(imname[i], featname[i])
    l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {}
for i in range(4):    //循环次数=图像数量-1
    matches[i] = sift.match(d[i + 1], d[i])

# visualize the matches (Figure 3-11 in the book)
for i in range(4):    //循环次数=图像数量-1
    im1 = array(Image.open(imname[i]))
    im2 = array(Image.open(imname[i + 1]))
    figure()
    sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)


# function to convert the matches to hom. points
# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches[j].nonzero()[0]
    fp = homography.make_homog(l[j + 1][ndx, :2].T)
    ndx2 = [int(matches[j][i]) for i in ndx]
    tp = homography.make_homog(l[j][ndx2, :2].T)

    # switch x and y - TODO this should move elsewhere
    fp = vstack([fp[1], fp[0], fp[2]])
    tp = vstack([tp[1], tp[0], tp[2]])
    return fp, tp


# estimate the homographies
# 估计单应性矩阵
model = homography.RansacModel()

fp, tp = convert_points(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0]  # im 1 to 2

fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1

tp, fp = convert_points(2)  # NB: reverse order
H_32 = homography.H_from_ransac(fp, tp, model)[0]  # im 3 to 2

tp, fp = convert_points(3)  # NB: reverse order
H_43 = homography.H_from_ransac(fp, tp, model)[0]  # im 4 to 3

# 扭曲图像
delta = 100  # 用于填充和平移 for padding and translation

im1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)

im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)

im1 = array(Image.open(imname[3]), "f")
im_32 = warp.panorama(H_32, im1, im_02, delta, delta)

im1 = array(Image.open(imname[4]), "f")
im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)

figure()
imshow(array(im_42, "uint8"))
axis('off')
show()

Primero comprenda la teoría relevante del empalme, copie el código a Python para reproducirlo y resuelva los problemas encontrados uno por uno

1. Necesita instalar el paquete PCV

Consulte la solución mano a mano para resolver la instalación de Python PCV

2. Lea la imagen en el código, sin archivo .sift

imname es la imagen original que queremos empalmar

featname es un archivo tamiz, que debe generarse de acuerdo con la imagen original

referencia de código específico

# -*- 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 = 'D:/ComputerVision_code/img/sdl11.jpg'   //需要拼接的图像的位置
im = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'empire.sift')        //生成名称为empire的sift文件        
l1, d1 = sift.read_features_from_file('empire.sift')
 
figure()
gray()
subplot(121)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征',fontproperties=font)
 
# 检测harris角点
harrisim = harris.compute_harris_response(im)
 
subplot(122)
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()

Error: imperio.sift no encontrado

Motivo: la función process_image en sift.py en la carpeta PCV no se ha modificado.

Solución: descargue la versión VLFeat0.9.20, copie los tres archivos relacionados en su propio entorno de proyecto y luego modifique la dirección de apertura del archivo sift.py en Anaconda.

Referencia principal: [python] OSError: tamizar no encontrado resolución de problemas_Blog de Lin-CT-Blog de CSDN

El blogger habló de ello con gran detalle, así que no añadiré nada.

3. El archivo tamiz se genera correctamente y el programa de unión de imágenes puede continuar ejecutándose, pero se informa que el error no cumplió con los criterios de aceptación.

Motivo: problema de imagen, la imagen de entrada es demasiado oscura o demasiado borrosa, por lo que el sistema no puede realizar la extracción de características o no se pueden hacer coincidir muy pocos puntos de características (a veces esto sucede cuando la imagen es normal, de todos modos, simplemente cambie la imagen para resolver esto) problema).

Referencia principal: Errores y soluciones comunes de la visión artificial de Python (actualización continua)_Blog de Lin-CT-Blog de CSDN

Sensación personal: el uso del método anterior para unir imágenes requiere más y más puntos de características de imagen obvios para lograr un buen efecto de unión; de lo contrario, el programa no puede ejecutarse debido a que hay muy pocos puntos de características o el efecto de unión es deficiente.

Mi imagen tiene pocos puntos característicos, y la información de desplazamiento es básicamente conocida. Planeo hacer un rompecabezas a través de la traducción y la superposición. Estoy pensando si usar PS directamente (muy fragante) o encontrar un nuevo método de procesamiento de imágenes [no puedo' no ríes ni lloras]

Echa un vistazo a mis hermosos resultados de costura.

Adjunte dos publicaciones de blog de referencia más:

Extracción de características SIFT + coincidencia_Blog de Deer dolphin-CSDN blog_sift extracción y coincidencia de características

Experimento 4 - Unión de imágenes_Blog de cyh_first-CSDN Blog_imagen de prueba de unión de imágenes

Procesamiento de imágenes OpenCV: métodos comunes de unión de imágenes_C Jun Moxiao's Blog-CSDN Blog_opencv image stitching

Gracias por su ayuda en el proceso de resolver el problema. Si mi respuesta le ayuda, por favor deme un pulgar hacia arriba~~

Supongo que te gusta

Origin blog.csdn.net/MOZHOUH/article/details/124948274
Recomendado
Clasificación