@@ -1006,19 +1006,21 @@ def rgb_to_hsv(arr):
1006
1006
convert rgb values in a numpy array to hsv values
1007
1007
input and output arrays should have shape (M,N,3)
1008
1008
"""
1009
- out = np .empty_like (arr )
1009
+ out = np .zeros_like (arr )
1010
1010
arr_max = arr .max (- 1 )
1011
+ ipos = arr_max > 0
1011
1012
delta = arr .ptp (- 1 )
1012
- s = delta / arr_max
1013
- s [delta == 0 ] = 0
1013
+ s = np .zeros_like (delta )
1014
+ s [ipos ] = delta [ipos ] / arr_max [ipos ]
1015
+ ipos = delta > 0
1014
1016
# red is max
1015
- idx = (arr [:,:,0 ] == arr_max )
1017
+ idx = (arr [:,:,0 ] == arr_max ) & ipos
1016
1018
out [idx , 0 ] = (arr [idx , 1 ] - arr [idx , 2 ]) / delta [idx ]
1017
1019
# green is max
1018
- idx = (arr [:,:,1 ] == arr_max )
1020
+ idx = (arr [:,:,1 ] == arr_max ) & ipos
1019
1021
out [idx , 0 ] = 2. + (arr [idx , 2 ] - arr [idx , 0 ] ) / delta [idx ]
1020
1022
# blue is max
1021
- idx = (arr [:,:,2 ] == arr_max )
1023
+ idx = (arr [:,:,2 ] == arr_max ) & ipos
1022
1024
out [idx , 0 ] = 4. + (arr [idx , 0 ] - arr [idx , 1 ] ) / delta [idx ]
1023
1025
out [:,:,0 ] = (out [:,:,0 ]/ 6.0 ) % 1.0
1024
1026
out [:,:,1 ] = s
0 commit comments