首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从实验室格式的图像中获取颜色列表

从实验室格式的图像中获取颜色列表
EN

Code Review用户
提问于 2014-01-24 21:00:56
回答 1查看 2.1K关注 0票数 6

我需要编写一些代码,以获得图像中的RGB颜色列表,然后将它们转换为实验室颜色的NumPy数组。我成功地做到了这一点,但我想知道如何才能更有效地做到这一点。

代码语言:javascript
代码运行次数:0
运行
复制
from skimage.color import rgb2lab
from skimage.io import imread
import numpy as np
from PIL import Image  # @UnresolvedImport

def get_histogram (img):

    #histogram = plt.hist(img.flatten(), bins=100, facecolor='green', alpha=0.75)
    w, h = img.size  
    colours = img.getcolors(w*h)  #Returns a list [(pixel_count, (R, G, B))]
    num, colours_rgb = zip(*colours)
    r,g,b = zip(*colours_rgb)

    num_of_colours = len(r)
    w2,h2 = 1,num_of_colours
    data = np.zeros( (w2,h2,3), dtype=np.uint8)
    print(data.shape)
    data[0,:,0] = r 
    data[0,:,1] = g 
    data[0,:,2] = b
    print(data)
    colours_lab = rgb2lab(data)
EN

回答 1

Code Review用户

发布于 2014-01-27 16:07:07

  1. get_histogram没有docstring。这个功能是做什么的?img参数应该传递什么样的对象?
  2. 您可以导入skimage.io.imreadPIL.Image,但两者都不使用。
  3. 这个评论似乎不相关:#柱状图= plt.hist(img.flatten(),bins=100,facecolor='green',alpha=0.75)
  4. 有两个无用的print语句。我假设这些都是调试会话遗留下来的,而您忘记了删除它们。您可能会发现学习使用Python调试器很有用,这将避免将print语句添加到代码中。
  5. 这里有两项功能:(一)将图像中的颜色数据提取为Numpy数组;(二)将颜色数据从RGB转换为实验室色彩空间。把它们分开是有意义的(尤其是因为(ii)段是如此简单)。
  6. 这个函数的名称很差:它实际上没有得到直方图。(因为您放弃了num数组中的颜色计数。)这让我想知道你在用这个函数做什么。
  7. 您使用拼写"color“,但是调用的API使用拼写”color“。即使你更喜欢“颜色”的拼写,也最好保持一致。这样,遗忘和犯错的可能性就更小了。
  8. 如果将Numpy数组传递给numpy.array函数,则从Python列表创建Numpy数组通常很简单。没有必要乱搞numpy.zeros和按列分配。

因此,我会写以下几点:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np

def distinct_colors(img):
    """Return the distinct colors found in img.
    img must be an Image object (from the Python Imaging Library).
    The result is a Numpy array with three columns containing the
    red, green and blue values for each distinct color.

    """
    width, height = img.size
    colors = [rgb for _, rgb in img.getcolors(width * height)]
    return np.array(colors, dtype=np.uint8)

转换到实验室的颜色空间是如此简单,我不认为它需要一个功能。

更新

有一个小困难:skimage.color函数都需要一个三维或四维数组,因此只支持二维和三维图像。你的一系列不同的颜色是一个一维图像,所以它被拒绝了.但是,您可以很容易地使用numpy.reshape将其转换为第一个维度为1的二维图像,然后将其传递给rgb2lab,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
colors = distinct_colors(img)
rgb2lab(colors.reshape((1, -1, 3)))

或者,如果您希望第二维度为1,请使用.reshape((-1, 1, 3))

(我个人认为skimage.color的行为是荒谬的。为什么它关心维度的数量?在代码中似乎没有任何明显的原因。也许值得提交一份错误报告?)

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/39997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档