Estoy comenzando un nuevo proyecto que implicará tomar dos imágenes y comparar los centros de puntos dentro de las imágenes. El original será una imagen con 27 filas y 15 columnas de puntos. La segunda imagen será una versión distorsionada del original donde los puntos han cambiado de posición y forma.

Para comenzar este proyecto necesitaré almacenar los centros originales en una matriz.

He hecho una fórmula para encontrar el centro de cada círculo en el original.

X: n = 0..26 [48n+5]
Y: m = 0..14 [48m+5]

Como ejemplo, el centro del punto (2,5) sería

[48(2)+5, 48(5)+5] = [101, 245]

TLDR: necesito ayuda para almacenar coordenadas (x, y) usando la siguiente fórmula

[X,Y] = [48(n)+5 , 48(m)+5] for n = 0..26, m = 0..14

Actualización:

Entonces parece que la matriz 2D es lo que necesito usar. Al final quiero asignar a cada coordenada un nombre de cadena.

arr = []
for n in range(27):
    for m in range(27):
        arr.append([48*(m)+5 , 48*(n)+5])

for x in range(405):
print(arr[x])

Actualmente, utilizando este código, los números 0..404 producirán pares de coordenadas (0=[5,5] and 404=[1253,677]). Sin embargo, quiero una manera más fácil de hacer referencia a cada par de coordenadas en lugar de encontrar qué objeto es numéricamente.

Quiero asignar el punto superior izquierdo el nombre A0. Tendrá la propiedad A0 = [5,5] A medida que te mueves hacia la derecha, alcanzas el punto más a la derecha con el nombre del centro A26. Tendrá las siguientes propiedades A26 = [1253,5] Al ir al punto inferior izquierdo, su centro se llamará O0 y tendrá las propiedades de O0 = [5,677] y esa fila se extenderá hacia la derecha hasta que llegue al centro del punto inferior derecho llamado O26 que tiene las propiedades O26 = [1253,677]

Como puede ver en el diagrama a continuación, quiero poder invocar una cuadrícula de nombres que se formatearían de la siguiente manera.

A0...                          ...A26
.                                   .
.                                   .
.                                   .



.                                   .
.                                   .
.                                   .
O0...                          ...O26

Entonces, si pido las coordenadas de O26, devolvería [1253,677]

1
Mbatkis 15 jun. 2020 a las 17:48

3 respuestas

La mejor respuesta

Este es el camino directo para la matriz 2D:

arr = []
for n in range(27):
    for m in range(15):
        arr.append([48*(n)+5 , 48*(m)+5])

Esto es lo mismo para la matriz 3D:

arr = []
for n in range(27):
    sub = []
    for m in range(15):
        sub.append([48*(n)+5 , 48*(m)+5])
    arr.append(sub)

Para el segundo, puede acceder al valor de n y m es arr[n][m].

Un revestimiento para la misma solución:

arr = [[[48*n+5 , 48*m+5] for m in range(15)] for n in range(27)]

EDITAR

A medida que modificó su pregunta para etiquetar los índices, creo que la mejor manera de hacerlo es mediante un diccionario (utilizando la comprensión dict):

letters = list('ABCDEFGHIJKLMNO')
dic = {letters[m]+str(list(range(27))[n]):[48*n+5 , 48*m+5] 
       for m in range(15) for n in range(27)}

Dónde:

>>> dic['A1']
[53, 5]
>>> dic['A26']
[1253, 5]
>>> dic['O0']
[5, 677]
>>> dic['O26']
[1253, 677]

Espero que ayude, si es así, márquelo como uno, si no, hágamelo saber por qué.

2
A. Maman 15 jun. 2020 a las 19:06

Puede utilizar una simple comprensión de la lista para lograr su tarea

[(48*(n) + 5, 48*(m) + 5) for n in range(0, 27) for m in range(0, 15)]

Esto le dará una lista de tuplas, con cada tupla representando un punto de coordenadas.

0
Ashwin Shenoy 15 jun. 2020 a las 15:00

Hola, no entiendo cuál es tu pregunta, pero puedes almacenar tu imagen en una matriz o una lista de Python usando el siguiente código, usando un bucle anidado:

centers = []

for i in range(27):
   for j in range(15): 
      centers.append((48*n+5 , 48*m+5))

Pero si necesita más ayuda con el procesamiento de imágenes y cómo convertir su imagen en una matriz numpy, use el siguiente enlace: https://www.pluralsight.com/guides/importing- image-data-into-numpy-arrays

1
Dan R 15 jun. 2020 a las 17:25