[Numpy-discussion] Counting the Colors of RGB-Image

912 views
Skip to first unread message

a...@pdauf.de

unread,
Jan 15, 2012, 10:45:48 AM1/15/12
to Discussion of Numerical Python

Counting the Colors of RGB-Image,

nameit   im0   with im0.shape = 2500,3500,3

with this code:


tab0 = zeros( (256,256,256) , dtype=int)

tt = im0.view()

tt.shape = -1,3

for r,g,b in tt:

     tab0[r,g,b] += 1


Question:


Is there a faster way in numpy to get this result?


 

MfG elodw




Tony Yu

unread,
Jan 15, 2012, 11:03:29 AM1/15/12
to Discussion of Numerical Python

Assuming that your image is made up of integer values (which I guess they'd have to be if you're indexing into `tab0`), then you could write:

>>> rgb_unique = set(tuple(rgb) for rgb in tt)

I'm not sure if it's any faster than your loop, but I would assume it is.

-Tony

Nadav Horesh

unread,
Jan 15, 2012, 12:40:44 PM1/15/12
to Discussion of Numerical Python
im_flat = im0[...,0]*65536 + im[...,1]*256 +im[...,2]
colours = np.unique(im_flat)
 
   Nadav
 

From: numpy-discus...@scipy.org [numpy-discus...@scipy.org] On Behalf Of Tony Yu [tsy...@gmail.com]
Sent: 15 January 2012 18:03
To: Discussion of Numerical Python
Subject: Re: [Numpy-discussion] Counting the Colors of RGB-Image

Chris Barker

unread,
Jan 17, 2012, 3:20:37 PM1/17/12
to Discussion of Numerical Python
Here's a thought:

Too bad numpy doesn't have a 24 bit integer, but you could tack a 0
on, making your image 32 bit, then use histogram2d to count the
colors.

something like (untested):

# create the 32 bit image
32bit_im = np.zeros((w, h), dtype = np.uint32)
view = 32bit_im.view(dtype = np.uint8).reshape((w,h,4))
view[:,:,:3] = im

# histogram it:
bins = # this is the trick -- setting your bins right
# remember that histrogram is designed for floats, so
you're bin boundaries shold be between the inteer values you want.

colors = np.histogram(32bit_im, bins=bins)

NOTE: the image processing scikit may well have somethign already --
histogramming an image is a common process.

-Chris

> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Di...@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>

--
--

Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris....@noaa.gov
_______________________________________________
NumPy-Discussion mailing list
NumPy-Di...@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

a...@pdauf.de

unread,
Jan 18, 2012, 4:26:25 AM1/18/12
to numpy-di...@scipy.org

Sorry,


that i use this way to send an answer to Tony Yu , Nadav Horesh , Chris Barker.

When iam direct answering on Your e-mail i get an error 5.

I think i did a mistake.


Your ideas are very helpfull and the code is very fast.


Thank You


elodw 


Torgil Svensson

unread,
Jan 21, 2012, 8:49:24 AM1/21/12
to Discussion of Numerical Python
unique has an option to get indexes out which you can use in
combination with sort to get the actual counts out.

tab0 = zeros( 256*256*256 , dtype=int)
col=ravel(((im0[...,0].astype('u4')*256+im0[...,1])*256)+im0[...,2])
col,idx=unique(sort(col),True)
idx=hstack([idx,[2500*2500]])
tab0[col]=idx[1:]-idx[:-1]
tab0.shape=(256,256,256)

As Chris pointed out, if each pixel were 4 bytes you could probably
just use im0.view('>u4') for histogram values.

//Torgil

Chris Barker

unread,
Jan 23, 2012, 12:17:41 PM1/23/12
to Discussion of Numerical Python
On Wed, Jan 18, 2012 at 1:26 AM, <a...@pdauf.de> wrote:
> Your ideas are very helpfull and the code is very fast.

I'm curios -- a number of ideas were floated here -- what did you end up using?

-Chris


--

Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris....@noaa.gov

elodw

unread,
Jan 23, 2012, 2:40:21 PM1/23/12
to Discussion of Numerical Python
Am 23.01.2012 18:17, schrieb Chris Barker:
> On Wed, Jan 18, 2012 at 1:26 AM,<a...@pdauf.de> wrote:
>> Your ideas are very helpfull and the code is very fast.
> I'm curios -- a number of ideas were floated here -- what did you end up using?
>
> -Chris
>
>
I'am sorry but when i see the code of Torgil Svenson,
I think, "the game is over".

I use the follow. code:

t0=clock()

tt = n_im2.view()
tt.shape = -1,3
ifl = tt[...,0].astype(np.int)*256*256 + tt[...,1].astype(np.int)*256 +
tt[...,2].astype(np.int)
colors, inv = np.unique(ifl,return_inverse=True)

zus = np.array([colors[-1]+1])
colplus = np.hstack((colors,zus))
ccnt = np.histogram(ifl,colplus)[0]

t1=clock()
print (t1-t0)
t0=t1

Reply all
Reply to author
Forward
0 new messages