代码之家  ›  专栏  ›  技术社区  ›  Jean-Pat

使用scikit图像的HSV颜色旋转

  •  3
  • Jean-Pat  · 技术社区  · 12 年前

    其目的是将纯红色图像转换为色轮的任何色调。

    • 首先将单色图像转换为RGB红色图像,例如: original monochrome image
    • 然后转换为HSV
    • 通过添加假定为 匹配车轮颜色
    • 然后将hsv图像反向转换为rgb颜色空间。

    问题是只能获得绿色或蓝色图像(n o yellow for an angle~30° for example ): Hue rotation

    在一些ipython单元中执行的代码依赖于scikit图像0.10dev:

    from skimage import io
    from skimage import color
    from scipy import ndimage as nd
    import numpy as np
    from matplotlib import pyplot as plt
    import os
    cy55 = io.imread('/home/jeanpat/MFISH/PSI/P07/01/Cy5/P070109C.tif')
    
    zero = np.zeros(cy55.shape,dtype=np.uint8)
    rgb0 = np.dstack([cy55, zero,zero])
    
    hue_rotations = [18, 36,72,90,108]
    images = {}
    images[0] = rgb0
    hsv0 = color.rgb2hsv(rgb0)
    print hsv0[:,:,0].dtype
    for hue in hue_rotations:
        hsv = np.copy(hsv0)
        hsv[:,:,0] = hsv[:,:,0]+ hue
        rgb = color.hsv2rgb(hsv)
        images[hue] = rgb
    i = 1
    plt.figure(num=None, figsize=(15, 5),  facecolor='w', edgecolor='k')
    for hue in np.sort(images.keys()):
        plt.subplot(1,6,i,xticks=[],yticks=[])
        plt.title('hue='+str(hue))
        plt.imshow(images[hue])
        i = i +1
    plt.show()
    
    1 回复  |  直到 12 年前
        1
  •  8
  •   Tony S Yu    12 年前

    我在邮件列表中回答了这个问题,但我将在这里复制解决方案,以便更容易找到(并且格式更漂亮)。

    基本上,在色调的表示方式(0-1而不是0-180)、uint8与浮点数据类型以及灰度图像如何转换为RGB方面存在一些差异。一个快速的用法示例可能如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import color
    from skimage import data
    
    
    def colorize(image, hue):
        """Return image tinted by the given hue based on a grayscale image."""
        hsv = color.rgb2hsv(color.gray2rgb(image))
        hsv[:, :, 0] = hue
        hsv[:, :, 1] = 1  # Turn up the saturation; we want the color to pop!
        return color.hsv2rgb(hsv)
    
    
    image = data.camera()[::2, ::2]
    
    hue_rotations = np.linspace(0, 1, 6)  # 0--1 is equivalent to 0--180
    colorful_images = [colorize(image, hue) for hue in hue_rotations]
    
    fig, axes = plt.subplots(nrows=2, ncols=3)
    
    for ax, array in zip(axes.flat, colorful_images):
        ax.imshow(array, vmin=0, vmax=1)
        ax.set_axis_off()
    
    plt.show()
    

    其给出:

    colorized grayscale image

    推荐文章