[Numpy-discussion] Optimizing speed for large-array inter-element algorithms (specifically, color space conversion)
Bruce Southey
bsouthey at gmail.com
Mon Jan 21 12:33:20 EST 2008
Hi,
I don't know the area but following your code I would suggest the
completely untested code. I am not sure about the conditions to get h
so I leave you get to the correct h and transform it appropriately.
Bruce
# First create 2 dimensional array/matrix (number of pixels by three):
'rows' are pixels and one 'columns' for each of r, g, b values, say
RGB from the image
# Compute v ie maximum across r, g and b for each pixel
v=RGB.max(axis=1)
#compute range between high and low values for each pixel
maxmin=v-RGB.min(axis=1)
#compute s
s=maxmin/v
#Compute h
hr=(RGB[:,1]-RGB[:,2])/maxmin
hg=2.0+(RGB[:,2]-RGB[:,0])/maxmin
hb=4.0+(RGB[:,0]-RGB[:,1])/maxmin
#Some code to get h
#Final output
HSV=255.0*numpy.column_stack(h,s,v)
On Jan 21, 2008 8:39 AM, theodore test <tteststudent at gmail.com> wrote:
> Hello all,
>
> I'm scratching my head over how to make this image color space conversion
> from "RGB" to "HSV" quicker. It requires input from all three bands of a
> given pixel at each pixel, and thus can't be easily flattened. I've already
> implemented psyco and removed the extra step of calling colorsys's
> rgb_to_hsv function by adapting the code into my primary for loop.
>
> Right now it takes around 9 seconds for a single 1600x1200 RGB image, a
> conversion that I've seen implemented more or less instantly in, say,
> ImageJ. What can I do to make this conversion more efficient?
>
> Thank you in advance,
> Theodore Test
>
> ------------
>
>
> #Necessary imports and hand-waving at psyco usage.
> import numpy
> from numpy import *
> from scipy.misc import pilutil
>
> import psyco
> psyco.full()
>
>
> # Read image file, cram it into a normalized array with one row per pixel
> # with each column holding the given pixel's R,G, or B band-value.
> s = pilutil.imread('A_Biggish_Image.tif')
> r,c,d = s.shape
>
> l = r*c
> t = t.reshape(l,3)
> t = t/255.0
>
>
> # Cycle through all of the pixels, converting them to HSV space and putting
> them
> # back into the array. This is the big time-waster.
> #
> # The conversion is adapted directly from colorsys.rgb_to_hsv to reduce call
> time
> for x in range(0,l):
> tr = float(t[x,0])
> tg = float(t[x,1])
> tb = float(t[x,2])
> maxc = max(tr, tg, tb)
> minc = min(tr, tg, tb)
> v = maxc
> if minc == maxc:
> t[x,0],t[x,1],t[x,2] = 0.0, 0.0, v
> else:
> s = (maxc-minc) / maxc
> rc = (maxc-tr) / (maxc-minc)
> gc = (maxc-tg) / (maxc-minc)
> bc = (maxc-tb) / (maxc-minc)
> if tr == maxc: h = bc-gc
> elif tg == maxc: h = 2.0+rc-bc
> else: h = 4.0+gc-rc
> h = (h/6.0) % 1.0
> t[x,0],t[x,1],t[x,2] = h, s, v
>
> # Renormalize shape and contents to image-file standards.
> t = t*255.0
> t = t.astype(uint8)
> t = t.reshape(r,c,d)
>
> finaloutputarray = t
>
> --------
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
>
More information about the NumPy-Discussion
mailing list