Detectar mesa rectangular a partir de la imagen IR de ASUS Xtion Live Pro.
Tengo una imagen de IR con una resolución de (240 x 320), de tipo de dato: float32, como se puede ver aquí:
La imagen “npy” cruda está aquí.
Mi objetivo es detectar la mesa (contorno marrón) para recortar esta región como una ROI.
Lo que he intentado hasta ahora es lo siguiente:
1. Ecualización del histograma para aumentar el contraste,
2. Desenfoque gaussiano para reducir el ruido, y
3. Detección de contornos para encontrar la mesa rectangular en el centro de la imagen.
Tenga en cuenta que la mesa en mi caso está instalada sobre ruedas, por lo que podría moverse ligeramente, por lo que quiero detectarla dinámicamente y no utilizar su posición fija dentro de la imagen.
El código que he utilizado es:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
import random as rng
path = ""
# Leer el arreglo numpy
ir_raw = np.load(path+"ir.npy") # (240, 320) float32
ir = np.uint8((ir_raw/ir_raw.max()) * 255)
# Ecualización del histograma (ajuste de contraste)
heq_ir = cv2.equalizeHist(ir)
# Suavizado gaussiano (eliminación de ruido)
g_blur_ir = cv2.GaussianBlur(heq_ir, (5,5), 0)
# Umbralización de Otsu
_, thresh_ir = cv2.threshold(g_blur_ir, 120, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Encontrar contornos
contours, hierarchy = cv2.findContours(thresh_ir, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Dibujar contornos
rng.seed(12345)
drawing = np.zeros((thresh_ir.shape[0], thresh_ir.shape[1], 3), dtype=np.uint8)
for i in range(len(contours)):
color = (rng.randint(0,256), rng.randint(0,256), rng.randint(0,256))
cv2.drawContours(drawing, contours, i, color, 2, cv2.LINE_8, hierarchy, 0)
plt.subplot(121)
plt.imshow(heq_ir)
plt.title("IR")
plt.subplot(122)
plt.imshow(drawing)
plt.title("Contornos IR")
plt.show()
¿Puede decirme cómo puedo detectar la mesa rectangular para recortarla como una ROI? Gracias de antemano.
davy.ai
Para detectar la mesa rectangular en la imagen de infrarrojos (IR) y recortarla como una ROI, puedes seguir los siguientes pasos:
Utiliza la transformada de Hough para detectar líneas rectas en la imagen. En particular, utiliza la transformada de Hough probabilística (
cv2.HoughLinesP
) para detectar los cuatro lados de la mesa rectangular. Esto te dará una lista de segmentos de línea que aproximan los lados de la mesa.Agrupa los segmentos de línea en cuatro grupos, correspondientes a los cuatro lados de la mesa. Puedes hacer esto calculando el ángulo de cada segmento de línea y agrupándolos en base a sus ángulos relativos.
Encuentra los puntos de intersección de los cuatro grupos de segmentos de línea, lo cual te dará las cuatro esquinas de la mesa. Puedes hacer esto encontrando la intersección de cada par de líneas que pertenezcan a diferentes grupos.
Recorta la región de interés (ROI) basada en las cuatro esquinas de la mesa. Para hacer esto, puedes utilizar las funciones
cv2.getPerspectiveTransform
ycv2.warpPerspective
para realizar una transformación perspectiva en la imagen, lo cual mapeará la mesa a una forma rectangular.Aquí tienes un ejemplo de código que demuestra estos pasos:
Ten en cuenta que este código asume que la mesa es rectangular y que tiene cuatro lados que son aproximadamente paralelos a los bordes de la imagen. Si la mesa tiene una forma irregular o no está alineada con la imagen, entonces pueden ser necesarios pasos de procesamiento adicionales para detectarla con precisión.