P17 — Encontrar el centro de la línea en una fila de la imagen
Un programa encuentra una cinta negra en una fila de la imagen en escala de grises (0 = negro, 255 = blanco) con estas líneas:
umbral = fila.mean() * 0.7pesos = np.maximum(0, umbral - fila)centro_x = center_of_mass(pesos)[0]centro_x = centro_x if not np.isnan(centro_x) else width // 2error_x = width // 2 - centro_xcenter_of_mass(pesos) calcula , donde es el número de la columna (desde 0) y el peso; si todos los pesos son 0, da nan. Para simplificar, la imagen tiene solo 16 columnas (width = 16) y la fila es:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| valor | 180 | 182 | 178 | 181 | 179 | 120 | 40 | 35 | 38 | 110 | 177 | 183 | 180 | 179 | 181 | 178 |
- Calcule el promedio de la fila y el umbral. ¿Qué columnas tienen peso distinto de cero y cuánto vale cada peso?
- Calcule
centro_xyerror_x. ¿La cinta está a la izquierda o a la derecha del centro de la imagen? - Se apaga parte de la luz y todos los valores bajan a la mitad. Calcule de nuevo el umbral y
centro_x. ¿Qué concluye sobre calcular el umbral con el promedio? - Un compañero cambia la primera línea por
umbral = 100, un número fijo. Con la luz a la mitad, ¿cuántas columnas quedan con peso distinto de cero? ¿Sigue distinguiendo la cinta del fondo? - Se quita la cinta y todos los valores quedan entre 175 y 183. ¿Qué devuelve
center_of_massy quéerror_xentrega el programa? ¿Qué hace el robot y qué riesgo tiene ese comportamiento?
Mostrar solución
- La suma es 2321 y el promedio . Umbral . Solo las columnas 6, 7 y 8 están por debajo: , , . Las columnas 5 (120) y 9 (110) son borde de la cinta, pero quedan por encima del umbral.
- .
error_xpx. La cinta está un poco a la izquierda del centro de la imagen. - Promedio , umbral . Siguen pasando solo las columnas 6, 7 y 8, con pesos , y , exactamente la mitad de antes, y : no cambia. Como el umbral es proporcional al promedio, si toda la fila se oscurece en la misma proporción, el umbral baja igual y el resultado no depende de la iluminación.
- Con la luz a la mitad, el fondo vale unos 90, que es menos que 100: las 16 columnas tienen peso. Los pesos del fondo son unos 10 y los de la cinta unos 80, así que el centro todavía da 7.22, pero el programa ya no está separando la cinta del fondo; si se quitara la cinta, reportaría una “línea” en la mitad de la imagen.
- El promedio es unos 179 y el umbral unos 125: ningún valor está por debajo, todos los pesos son 0,
center_of_massdanany el programa usawidth // 2 = 8. Entonceserror_x = 0: el robot sigue derecho como si estuviera centrado sobre la línea. Es razonable para un hueco corto en la cinta, pero si la perdió de verdad (por ejemplo, en una curva cerrada) seguirá derecho sin buscarla. Convendría detectar ese caso y detenerse o girar a buscar la línea.