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.

¿Existe alguna función o método para mostrar los grupos de imágenes después de la segmentación de imágenes K-means?

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('jelly.jpg') //leyendo la imagen
cv2.imshow('img',img) //imagen inicial
cv2.waitKey(0)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) //convirtiendo la imagen a RGB

pixel_vals = img.reshape((-1,3)) //reshape de la imagen de 3D a 2D

pixel_vals = np.float32(pixel_vals)

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,100,0.85) //definiendo los criterios para kmeans

k = 5 //número de clusters

retval, labels, centers = cv2.kmeans(pixel_vals,k,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

centers = np.uint8(centers)
segmented_data = centers[labels.flatten()]
segmented_img = segmented_data.reshape((img.shape)) //imagen final

cv2.imshow('Imagen segmentada por K-means',segmented_img) //mostrando la imagen final después de la segmentación por k-means
cv2.waitKey(0)

cv2.destroyAllWindows() //eliminando todas las ventanas emergentes de las imágenes

Deseo obtener solo la parte violeta o marrón de acuerdo a las intensidades. He intentado buscar, pero no puedo encontrar ninguna función. Ya que existe la posibilidad de que el color azul o cualquier otro color esté presente en diferentes tonos. ¿Hay alguna manera de obtener una tonalidad específica de diferentes colores y enmascarar otras áreas?
Imagen original
enter image description here

Imagen segmentada por k-means
enter image description here
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el espacio de color HSV para aislar tonalidades específicas de diferentes colores. En OpenCV, puedes convertir una imagen de RGB a HSV utilizando la función cv2.cvtColor() con el indicador cv2.COLOR_RGB2HSV. Luego, puedes crear una máscara que filtre los píxeles cuyo matiz, saturación o valor estén fuera de un rango determinado. Aquí tienes un fragmento de código de ejemplo que muestra cómo extraer solo las partes violeta y marrón de la imagen original:

    import cv2
    import numpy as np
    
    # lee la imagen y conviértela al espacio de color HSV
    img = cv2.imread('jelly.jpg')
    img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
    
    # define los rangos de color para violeta y marrón en HSV
    violet_lower = np.array([125, 50, 50])
    violet_upper = np.array([155, 255, 255])
    brown_lower = np.array([5, 50, 50])
    brown_upper = np.array([25, 255, 255])
    
    # crea máscaras para las partes violeta y marrón
    violet_mask = cv2.inRange(img_hsv, violet_lower, violet_upper)
    brown_mask = cv2.inRange(img_hsv, brown_lower, brown_upper)
    
    # combina las máscaras para obtener una máscara final que incluya tanto violeta como marrón
    final_mask = cv2.bitwise_or(violet_mask, brown_mask)
    
    # aplica la máscara a la imagen original para extraer solo las partes violeta y marrón
    segmented_img = cv2.bitwise_and(img, img, mask=final_mask)
    
    # muestra la imagen final
    cv2.imshow('Partes Violeta y Marrón', segmented_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    En este código, primero convertimos la imagen original a HSV utilizando cv2.cvtColor(). Luego, definimos los rangos de color para las partes violeta y marrón en HSV utilizando np.array(). Los límites inferiores y superiores de los rangos corresponden a los valores mínimos y máximos de matiz, saturación y valor para los colores respectivos. Creamos máscaras para cada rango de color utilizando cv2.inRange(), que devuelve una imagen binaria que incluye solo los píxeles cuyos valores están dentro del rango especificado. Luego, combinamos las máscaras utilizando cv2.bitwise_or() para obtener una máscara final que incluye tanto violeta como marrón. Finalmente, aplicamos la máscara a la imagen original utilizando cv2.bitwise_and() para extraer solo los píxeles que están incluidos en la máscara final, lo que resulta en una imagen segmentada que incluye solo las partes violeta y marrón.

Comments are closed.