mirror of
https://github.com/wassname/scikit-image.git
synced 2026-08-08 11:26:12 +08:00
Implement hsv2rgb.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
|
||||
from __future__ import division
|
||||
|
||||
__all__ = ["rgb2hsv"]
|
||||
__all__ = ['rgb2hsv', 'hsv2rgb']
|
||||
__docformat__ = "restructuredtext en"
|
||||
|
||||
import numpy as np
|
||||
@@ -83,3 +83,61 @@ def rgb2hsv(rgb):
|
||||
|
||||
return out
|
||||
|
||||
|
||||
def hsv2rgb(hsv):
|
||||
"""HSV to RGB color space conversion.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hsv : ndarray
|
||||
The image in HSV format, in a 3-D array of shape (.., .., 3).
|
||||
|
||||
Returns
|
||||
-------
|
||||
out : ndarray
|
||||
The image in RGB format, in a 3-D array of shape (.., .., 3).
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If `hsv` is not a 3-D array of shape (.., .., 3).
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> import os
|
||||
>>> from scikits.image import data_dir
|
||||
>>> from scikits.image.io import imread
|
||||
|
||||
>>> lena = imread(os.path.join(data_dir, 'lena.png'))
|
||||
>>> lena_hsv = rgb2hsv(lena)
|
||||
>>> lena_rgb = hsv2rgb(lena_hsv)
|
||||
"""
|
||||
|
||||
if type(hsv) != np.ndarray:
|
||||
raise TypeError, "the input array 'hsv' must be a numpy.ndarray"
|
||||
|
||||
if hsv.ndim != 3 or hsv.shape[2] != 3:
|
||||
msg = "the input array 'hsv' must be have a shape == (.,.,3))"
|
||||
raise ValueError, msg
|
||||
|
||||
arr = hsv.astype("float32")
|
||||
|
||||
hi = np.floor(arr[:,:,0] * 6)
|
||||
f = arr[:,:,0] * 6 - hi
|
||||
p = arr[:,:,2] * (1 - arr[:,:,1])
|
||||
q = arr[:,:,2] * (1 - f * arr[:,:,1])
|
||||
t = arr[:,:,2] * (1 - (1 - f) * arr[:,:,1])
|
||||
v = arr[:,:,2]
|
||||
|
||||
hi = np.dstack([hi, hi, hi]).astype("uint8") % 6
|
||||
out = np.choose(hi, [np.dstack((v, t, p)),
|
||||
np.dstack((q, v, p)),
|
||||
np.dstack((p, v, t)),
|
||||
np.dstack((p, q, v)),
|
||||
np.dstack((t, p, v)),
|
||||
np.dstack((v, p, q))])
|
||||
|
||||
# remove NaN
|
||||
out[np.isnan(out)] = 0
|
||||
|
||||
return out
|
||||
|
||||
@@ -14,17 +14,20 @@ from numpy.testing import *
|
||||
from scikits.image.io import imread
|
||||
from scikits.image.color import (
|
||||
rgb2hsv,
|
||||
hsv2rgb,
|
||||
)
|
||||
|
||||
from scikits.image import data_dir
|
||||
|
||||
import colorsys
|
||||
|
||||
|
||||
class TestColorconv(TestCase):
|
||||
|
||||
img_rgb = imread(os.path.join(data_dir, 'color.png'))
|
||||
img_grayscale = imread(os.path.join(data_dir, 'camera.png'))
|
||||
|
||||
# RGB to HSV
|
||||
def test_rgb2hsv_conversion(self):
|
||||
rgb = self.img_rgb.astype("float32")[::16, ::16]
|
||||
hsv = rgb2hsv(rgb).reshape(-1, 3)
|
||||
@@ -43,6 +46,27 @@ class TestColorconv(TestCase):
|
||||
def test_rgb2hsv_error_list(self):
|
||||
self.assertRaises(TypeError, rgb2hsv, [self.img_rgb[0,0]])
|
||||
|
||||
|
||||
# HSV to RGB
|
||||
def test_hsv2rgb_conversion(self):
|
||||
rgb = self.img_rgb.astype("float32")[::16, ::16]
|
||||
# create HSV image with colorsys
|
||||
hsv = np.array([colorsys.rgb_to_hsv(pt[0], pt[1], pt[2])
|
||||
for pt in rgb.reshape(-1, 3)]).reshape(rgb.shape)
|
||||
# convert back to RGB and compare with original.
|
||||
# float32 -> relative precision about 1e-6
|
||||
assert_almost_equal(rgb, hsv2rgb(hsv), decimal=4)
|
||||
|
||||
def test_hsv2rgb_error_grayscale(self):
|
||||
self.assertRaises(ValueError, hsv2rgb, self.img_grayscale)
|
||||
|
||||
def test_hsv2rgb_error_one_element(self):
|
||||
self.assertRaises(ValueError, hsv2rgb, self.img_rgb[0,0])
|
||||
|
||||
def test_hsv2rgb_error_list(self):
|
||||
self.assertRaises(TypeError, hsv2rgb, [self.img_rgb[0,0]])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_module_suite()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user