Thanks Juan and Michael for your knowledge and time. I did have to convert
my dtype int64 rgb values to uint8 then used went with Juan's suggestion to
use img_as_float to scale them to floating point values within the confines
required by scikit-image and then added a newaxis to make the input np
array suitable for rgb2lab which returned me a structure  (1, 827, 3) so
used [0] to get a shape of (827,3) before transposing L*, A* and B* into my
original dataframe.

Thanks Gents, learned alot but I suspect its only the start of my required
learning :)

On Fri, 3 Mar 2017 at 23:51 Juan Nunez-Iglesias <jni.s...@gmail.com> wrote:

> Hi Michael,
>
> You can use the `.values` property to get a NumPy array out of a pandas
> DataFrame. After that it’s just a matter of slight reshaping to make
> skimage think that it’s a long, thin image. =)
>
> ========================================
>
> In [1]: x = np.array([[0, 0, 255], [55, 0, 25], [4, 0,
> 5]]).astype(np.uint8)
>
> In [2]: from skimage import img_as_float, color
>
> In [12]: x = img_as_float(x)
>
> In [15]: df = pd.DataFrame(dict(RGB_r=x[:, 0], RGB_g=x[:, 1], RGB_b=x[:,
> 2]))
>
> In [16]: df[['RGB_r', 'RGB_g', 'RGB_b']].values
> Out[16]:
> array([[ 0.        ,  0.        ,  1.        ],
>        [ 0.21568627,  0.        ,  0.09803922],
>        [ 0.01568627,  0.        ,  0.01960784]])
>
> In [17]: lab = color.rgb2lab(df[['RGB_r', 'RGB_g’,
> 'RGB_b']].values[np.newaxis])[0]
>
> In [18]: lab
> Out[18]:
> array([[  32.29567257,   79.18559091, -107.85730021],
>        [   7.97293614,   28.7263062 ,   -0.51735934],
>        [   0.33216914,    1.74121634,   -1.52356365]])
>
> In [19]: df['Lab_l'], df['Lab_a'], df['Lab_b'] = lab.T
>
> In [20]: df
> Out[20]:
>       RGB_b  RGB_g     RGB_r      Lab_l      Lab_a       Lab_b
> 0  1.000000    0.0  0.000000  32.295673  79.185591 -107.857300
> 1  0.098039    0.0  0.215686   7.972936  28.726306   -0.517359
> 2  0.019608    0.0  0.015686   0.332169   1.741216   -1.523564
>
> ========================================
>
> Just make sure your RGB values are in the right data type and range for
> scikit-image:
> http://scikit-image.org/docs/dev/user_guide/data_types.html
>
> Typically that means uint8s in [0, 255] or floats in [0, 1].
>
> Hope this helps!
>
> Juan.
>
> On 4 Mar 2017, 1:44 AM +1100, Michael O'Brien <mob....@gmail.com>, wrote:
>
> Hi all,
>
> I was hoping the community may be able to help me. I want to convert rgb
> values to their L*A*B* value but I'm not sure of the best way to do so so
> the setup will scale when the dataframe size increases.
>
> I saw on stackoverflow that skimage's conversion method
> http://scikit-image.org/docs/dev/api/skimage.color.html?highlight=rgb2lab#skimage.color.rgb2lab
>  was suggested to be faster than alternatives but I'm having trouble
> understanding how to use my dataframe as the input instead of an image and
> if the conversion is successful how I can store the LAB values back into
> the dataframe. At the moment my dataframe has a shape 
>
> (827, 8) where Rgb_r, Rgb_g, Rgb_b are the column names I'm interested in, 
> you could think of the dataframe of 827 individual pixels with associated 
> metadata.
>
> Is it possible to pass a pandas dataframe to scikit-image color.rgb2.lab or 
> should I do row by row calculates for the situation where the number of rows 
> increases to possibly 200,000 or more
>
> Hope you can help me
>
> Michael
>
> _______________________________________________
> scikit-image mailing list
> scikit-image@python.org
> https://mail.python.org/mailman/listinfo/scikit-image
>
>
_______________________________________________
scikit-image mailing list
scikit-image@python.org
https://mail.python.org/mailman/listinfo/scikit-image

Reply via email to