@@ -1053,19 +1053,21 @@ def rgb_to_hsv(arr):
1053
1053
convert rgb values in a numpy array to hsv values
1054
1054
input and output arrays should have shape (M,N,3)
1055
1055
"""
1056
- out = np .empty_like (arr )
1056
+ out = np .zeros_like (arr )
1057
1057
arr_max = arr .max (- 1 )
1058
+ ipos = arr_max > 0
1058
1059
delta = arr .ptp (- 1 )
1059
- s = delta / arr_max
1060
- s [delta == 0 ] = 0
1060
+ s = np .zeros_like (delta )
1061
+ s [ipos ] = delta [ipos ] / arr_max [ipos ]
1062
+ ipos = delta > 0
1061
1063
# red is max
1062
- idx = (arr [:,:,0 ] == arr_max )
1064
+ idx = (arr [:,:,0 ] == arr_max ) & ipos
1063
1065
out [idx , 0 ] = (arr [idx , 1 ] - arr [idx , 2 ]) / delta [idx ]
1064
1066
# green is max
1065
- idx = (arr [:,:,1 ] == arr_max )
1067
+ idx = (arr [:,:,1 ] == arr_max ) & ipos
1066
1068
out [idx , 0 ] = 2. + (arr [idx , 2 ] - arr [idx , 0 ] ) / delta [idx ]
1067
1069
# blue is max
1068
- idx = (arr [:,:,2 ] == arr_max )
1070
+ idx = (arr [:,:,2 ] == arr_max ) & ipos
1069
1071
out [idx , 0 ] = 4. + (arr [idx , 0 ] - arr [idx , 1 ] ) / delta [idx ]
1070
1072
out [:,:,0 ] = (out [:,:,0 ]/ 6.0 ) % 1.0
1071
1073
out [:,:,1 ] = s
0 commit comments