es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenCV, Python: ¿Existe alguna manera de detectar nubes y sol al mismo tiempo?

Soy nuevo en python y opencv, así que no conozco muchas funciones todavía, pero aquí está mi pregunta.

En esta imagen puedes ver que mi código puede detectar el sol, ya que el sol está compuesto de píxeles completamente blancos [0,0,0]. Simplemente recorrí todos los píxeles y comprobé cuáles son blancos, y funcionó bastante bien. También hay un poco de ruido, pero eso no me afecta hasta ahora.
sol sin nubes
Sin embargo, cuando el sol está completamente o parcialmente cubierto por nubes, este es el resultado:
sol cubierto por nubes

Entonces mi pregunta es: ¿hay alguna forma de detectar y separar tanto el sol como las nubes? Estoy utilizando el color de los píxeles para detectar el sol, pero eso probablemente no funcionará si quiero detectar y hacer que mi programa los distinga.

Aquí está mi código:

import cv2 as cv
import numpy as np

img = cv.imread('sc2.png')
img = cv.resize(img, (900,500), interpolation = cv.INTER_LINEAR)
#gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
height, width, channels = img.shape

bela = [255,255,255]
crna = [0,0,0]

for x in range(width):
    for y in range(height):
        pixels_xy = img[y,x]
        if all(pixels_xy == bela):
            img[y,x] = crna

cv.imshow('img',img)
#cv.imshow('gray',gray)
cv.waitKey(0)
cv.destroyAllWindows()

¡Gracias por todos los consejos!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como has identificado correctamente, utilizar la detección de color no funcionará si quieres detectar y distinguir entre el sol y las nubes cuando se superponen. Un enfoque posible para abordar este problema es utilizar técnicas de segmentación de imágenes.

    La segmentación de imágenes es el proceso de dividir una imagen en múltiples segmentos o regiones con el objetivo de simplificar o cambiar la representación de una imagen en algo más significativo y más fácil de analizar. Hay varias técnicas de segmentación de imágenes disponibles, como el umbral, la detección de bordes y el crecimiento de regiones.

    En tu caso, una posible solución sería utilizar el umbral para separar el sol de las nubes. El umbral es un proceso de conversión de una imagen en una imagen binaria, en la que cada píxel es blanco o negro, basado en un determinado valor umbral. Puedes utilizar el umbral para separar el sol de las nubes estableciendo un umbral en los valores de píxeles de tal manera que los píxeles del sol sean blancos y los píxeles de las nubes sean negros.

    Aquí tienes un ejemplo de código que muestra cómo utilizar el umbral para segmentar el sol de las nubes:

    import cv2 as cv
    import numpy as np
    
    img = cv.imread('sol_con_nubes.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    # Aplicar el umbral para convertir la imagen en una imagen binaria
    valor_umbral = 220
    umbral, img_binaria = cv.threshold(gray, valor_umbral, 255, cv.THRESH_BINARY)
    
    # Buscar contornos en la imagen binaria
    contornos, jerarquia = cv.findContours(img_binaria, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    
    # Dibujar los contornos en la imagen original
    img_contorno = np.copy(img)
    cv.drawContours(img_contorno, contornos, -1, (0, 255, 0), 2)
    
    # Mostrar las imágenes
    cv.imshow('Imagen Original', img)
    cv.imshow('Imagen Binaria', img_binaria)
    cv.imshow('Imagen de Contorno', img_contorno)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    En este código, leemos la imagen y la convertimos a escala de grises. Luego aplicamos el umbral con un valor de umbral de 220 para convertir la imagen en escala de grises en una imagen binaria. A continuación, utilizamos la función findContours en OpenCV para encontrar los contornos en la imagen binaria. Finalmente, dibujamos los contornos en la imagen original y mostramos las tres imágenes.

    Puedes ajustar el valor del umbral para optimizar la segmentación del sol y las nubes en función de tu imagen. También puedes experimentar con otras técnicas de segmentación de imágenes para obtener mejores resultados.

Comments are closed.