Color rotation in HSV using scikit-image

醉酒当歌 提交于 2019-12-06 08:41:07

问题


The aim is to convert a pure red image into any hue of the color wheel.

  • A monochrome image is first converted into a RGB red image, ex:

  • then converted into HSV
  • The hue component is modified by adding an angle value supposed to match the wheel color
  • then the hsv image is back converted into the rgb color space.

The problem is that only green or blue image can be obtained (no yellow for an angle~30° for example):

The code performed in some ipython cells relies on scikit-image 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:


I answered this on the mailing list, but I'll copy the solution here so that it's easier to find (and the formatting is prettier).

Basically, there are some differences in how hue is represented (0--1 instead of 0--180), uint8 vs float data-types, and maybe some issues with how the grayscale image is converted to RGB. A quick example of usage might look like:

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()

which gives:



来源:https://stackoverflow.com/questions/22503938/color-rotation-in-hsv-using-scikit-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!