如何用图像中每个像素的颜色绘制图形?

Car*_*ego 5 python opencv graph image-processing python-3.x

我正在研究图像颜色识别,所以我将 RGB 图像转换为 Lab,因为它是最接近人类视觉的颜色空间。之后,我获得了 Lab 的 3 个通道中的每一个,我想在 3D 图形中绘制我在转换后的图像中识别的颜色变化。如何使用图像的颜色绘制图形?

import cv2
import numpy as np
import urllib
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.pyplot as plt

# Load an image that contains all possible colors.
request = urllib.urlopen('IMD021.png')
image_array = np.asarray(bytearray(request.read()), dtype=np.uint8)
image = cv2.imdecode(image_array, cv2.CV_LOAD_IMAGE_COLOR)

lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l_channel,a_channel,b_channel = cv2.split(lab_image)

fig = plt.figure()
ax = p3.Axes3D(fig)
ax.scatter(l_channel, a_channel, b_channel, marker='o',  facecolors=cv2.cvtColor(image, cv2.COLOR_BGR2RGB).reshape(-1,3)/255.)

ax.set_xlabel('L')
ax.set_ylabel('A')
ax.set_zlabel('B')
fig.add_axes(ax)
#plt.savefig('plot-15.png')
plt.show()
Run Code Online (Sandbox Code Playgroud)

出口: 在此处输入图片说明

Ulr*_*ern 4

以下是如何获得亚历山大建议的针对您的案例的答案:

# only change to question's code is the ax.scatter() line:
ax.scatter(l_channel, a_channel, b_channel, marker='o',
  facecolors=cv2.cvtColor(image, cv2.COLOR_BGR2RGB).reshape(-1,3)/255.)
Run Code Online (Sandbox Code Playgroud)

注意:该facecolors参数需要 RGB,而不是 OpenCV 的 BGR,并且对颜色数据的形状和类型很挑剔,因此需要进行重塑和划分。

这是代码应用于该图像时的结果:在此输入图像描述

  • 简单明了。另外,用一张多么好的照片来展示这一点!真是太统一了!我在这里还喜欢做的事情是将标记的不透明度和大小映射到具有该值的像素数量——通过不透明度为内部分布提供一点尺寸,并通过大小查看颜色的密度。并不是说这个答案需要有这样的补充,但对于任何实现演示或其他东西的人来说,这是一个很好的想法。 (2认同)