¿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
Imagen segmentada por k-means
“`
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 indicadorcv2.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: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 utilizandonp.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 utilizandocv2.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 utilizandocv2.bitwise_or()
para obtener una máscara final que incluye tanto violeta como marrón. Finalmente, aplicamos la máscara a la imagen original utilizandocv2.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.