¿Cómo extraer RGB de una imagen y trazar solo RG como un gráfico? R para X y G para Y

Estoy intentando extraer los componentes RGB de una imagen y trazar el histogrma 3D RGB utilizando matplotlib. Pero no sé cómo puedo hacerlo.

Aquí está mi código actual:

import cv2 import numpy as np from scipy import ndimage from matplotlib import pyplot as plt img_file = 'Paw03.png' img = cv2.imread(img_file, cv2.IMREAD_COLOR) # rgb #hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # hsv rows, cols, ch = img.shape for x in range(rows): for y in range(cols): if (img[x, y, 1] == img[0, 255, 0]): break; else: print "Pixel:", x, y print "R:", R print "G:", g print "B:", b print "\n" plt.plot(r, 'ro', b, 'b^') plt.xlim([0, 255]) plt.xlabel('Pixel') plt.ylabel('Quantity') plt.title('Distribution of RGB in the image') plt.show() 

¡Pero no funciona!

Entonces, lo intenté con tres para:

 import cv2 import numpy as np from scipy import ndimage from matplotlib import pyplot as plt img_file = 'Paw03.png' img = cv2.imread(img_file, cv2.IMREAD_COLOR) # rgb #hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # hsv rows, cols, ch = img.shape for x in range(rows): for y in range(cols): for z in range(ch) if (img[x, y, z] == img[0, 255, 0]): break; else: print "Pixel:", x, y print "R:", R print "G:", g print "B:", b print "\n" plt.plot(r, 'ro', b, 'b^') plt.xlim([0, 255]) plt.xlabel('Pixel') plt.ylabel('Quantity') plt.title('Distribution of RGB in the image') plt.show() 

Solo funciona para la impresión en for y también se guarda tres veces para cada píxel, y para matplotlib no funciona.

¿Alguien puede ayudarme?

El siguiente fragmento de código muestra un diagtwig de dispersión 3D de los colores RGB de su imagen:

 import numpy as np import matplotlib.image as mpimg from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D img = mpimg.imread('Paw03.png') pixels = img.shape[0]*img.shape[1] channels = 3 data = np.reshape(img[:, :, :channels], (pixels, channels)) histo_rgb, _ = np.histogramdd(data, bins=256) r, g, b = np.nonzero(histo_rgb) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter3D(r, g, b) ax.set_xlabel('Red') ax.set_ylabel('Green') ax.set_zlabel('Blue') plt.title('RGB colors') plt.show() 

Esto es lo que obtienes cuando ejecutas el código anterior (el resultado obviamente depende de la imagen en particular utilizada): Diagrama de dispersión 3D de los colores RGB de una imagen

Si su objective es visualizar en 3D el histogtwig 2D de las intensidades de los canales rojo y verde, este código le puede resultar útil:

 import numpy as np import matplotlib.image as mpimg from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D img = mpimg.imread('Paw03.png') pixels = img.shape[0]*img.shape[1] channels = 3 data = np.reshape(img[:, :, :channels], (pixels, channels)) histo_rgb, _ = np.histogramdd(data, bins=256) histo_rg = np.sum(histo_rgb, 2) levels = np.arange(256) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') for g in levels: ax.bar(levels, histo_rg[:, g], zs=g, zdir='y', color='r') ax.set_xlabel('Red') ax.set_ylabel('Green') ax.set_zlabel('Number of pixels') plt.show() 

Y aquí está la salida correspondiente: Representación 3D del histograma RG conjunto de una imagen.

No veo dónde están configurados los valores R, g y b en su ejemplo de código. También parece que plot.plot (r, ‘ro’, b, ‘b ^’) no estaría trazando series sino un solo punto.