473,406 Members | 2,713 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,406 software developers and data experts.

average of PIL images

hi
i have a set of RGB images of diff faces (of people )as a 2 dim
numpyarray
...something like
threefaces=array([[xa1,xa2,xa3],
[xb1,xb2,xb3],
[xc1,xc2,xc3]])
where xa1,xa2,xa3 are tuples each representing rgb values of a pixel
of first image ..

i need to create the average face image and display it.problem is i
need to calculate (xa1+xb1+xc1)/3 etc to calculate avearge value of
each pixel.how can i do this calculation.do i need to convert the
r,g,b in to a single value for each pixel? the average value of a
pixel will be a float isn't it? how can i create a PIL image from
this?
any help,directive greatly appreciated
eric
Feb 18 '08 #1
13 4847
vaneric wrote:
hi
i have a set of RGB images of diff faces (of people )as a 2 dim
numpyarray
..something like
threefaces=array([[xa1,xa2,xa3],
[xb1,xb2,xb3],
[xc1,xc2,xc3]])
where xa1,xa2,xa3 are tuples each representing rgb values of a pixel
of first image ..

i need to create the average face image and display it.problem is i
need to calculate (xa1+xb1+xc1)/3 etc to calculate avearge value of
each pixel.how can i do this calculation.
threefaces.mean(axis=0)
do i need to convert the
r,g,b in to a single value for each pixel?
It depends on the problem that you are trying to solve. If monochrome images are
acceptable for your problem, then it is probably best to convert all your images
to monochrome to do the averaging. At least for a first cut. Averaging color
images is tricky; you really shouldn't do it in the RGB colorspace. There are a
couple of colorspaces which you could choose; different problems require
different colorspaces.
the average value of a
pixel will be a float isn't it?
Yes.
how can i create a PIL image from
this?
# Cast the floating point data to bytes.
avgface = avgface.astype(numpy.uint8)

# Create the PIL image from the numpy data.
img = Image.fromstring('L', (width, height), avgface.tostring())

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

Feb 18 '08 #2
vaneric wrote:
hi
i have a set of RGB images of diff faces (of people )as a 2 dim
numpyarray
..something like
threefaces=array([[xa1,xa2,xa3],
[xb1,xb2,xb3],
[xc1,xc2,xc3]])
where xa1,xa2,xa3 are tuples each representing rgb values of a pixel
of first image ..

i need to create the average face image and display it.problem is i
need to calculate (xa1+xb1+xc1)/3 etc to calculate avearge value of
each pixel.how can i do this calculation.do i need to convert the
r,g,b in to a single value for each pixel? the average value of a
pixel will be a float isn't it? how can i create a PIL image from
this?
any help,directive greatly appreciated
eric
Take a look at ImageChops.difference. I've used it to calculate a
difference value as follows:

diff=ImageChops.difference(im1, im2)
totaldiff=sum(ImageStat.Stat(diff)._getmedian())

Maybe at least this will point you in the right direction.

-Larry Bates
Feb 18 '08 #3
On Feb 18, 10:18*am, vaneric <vaneric...@gmail.comwrote:
hi
i have a set of RGB images of diff faces (of people )as a 2 dim
numpyarray
..something like
threefaces=array([[xa1,xa2,xa3],
* * * *[xb1,xb2,xb3],
* * * *[xc1,xc2,xc3]])
where xa1,xa2,xa3 are *tuples each representing rgb values of a pixel
of first image ..

i need to create the average face image and display it.problem is i
need to calculate (xa1+xb1+xc1)/3 *etc to calculate avearge value of
each pixel.how can i do this calculation.do i need to convert the
r,g,b in to a single value for each pixel? the average value of a
pixel will be a float isn't it? how can i create a PIL image from
this?
any help,directive greatly appreciated
eric
import Numeric

arr = Numeric.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
])

col1 = arr[0:,0]
print col1

sum = 0
count = 0
for num in col1:
sum += num
count += 1

avg = (sum * 1.0)/count #convert one term to a float to get float
result
print avg
print round(avg)
print int(round(avg))
print arr[0]

size = len(arr[0])
for i in range(size):
col = arr[0:, i]
sum = 0
count = 0

for num in col:
sum += num
count += 1

result = (sum * 1.0) /count
print result,
result = int(round(result))
print result

--output:--
[ 1 4 7 10]
5.5
6.0
6
[1 2 3]
5.5 6
6.5 7
7.5 8
Feb 18 '08 #4
On Feb 18, 1:58*pm, 7stud <bbxx789_0...@yahoo.comwrote:
On Feb 18, 10:18*am, vaneric <vaneric...@gmail.comwrote:
hi
i have a set of RGB images of diff faces (of people )as a 2 dim
numpyarray
..something like
threefaces=array([[xa1,xa2,xa3],
* * * *[xb1,xb2,xb3],
* * * *[xc1,xc2,xc3]])
where xa1,xa2,xa3 are *tuples each representing rgb values of a pixel
of first image ..
i need to create the average face image and display it.problem is i
need to calculate (xa1+xb1+xc1)/3 *etc to calculate avearge value of
each pixel.how can i do this calculation.do i need to convert the
r,g,b in to a single value for each pixel? the average value of a
pixel will be a float isn't it? how can i create a PIL image from
this?
any help,directive greatly appreciated
eric

import Numeric

arr = Numeric.array([
* * [1, 2, 3],
* * [4, 5, 6],
* * [7, 8, 9],
* * [10, 11, 12]
])

col1 = arr[0:,0]
print col1

sum = 0
count = 0
for num in col1:
* * sum += num
* * count += 1

avg = (sum * 1.0)/count * #convert one term to a float to get float
result
print avg
print round(avg)
print int(round(avg))

print arr[0]

size = len(arr[0])
for i in range(size):
* * col = arr[0:, i]
* * sum = 0
* * count = 0

* * for num in col:
* * * * sum += num
* * * * count += 1

* * result = (sum * 1.0) /count
* * print result,
* * result = int(round(result))
* * print result

--output:--
[ 1 *4 *7 10]
5.5
6.0
6
[1 2 3]
5.5 6
6.5 7
7.5 8
In this statement:
col1 = arr[0:,0]
the first term is the row or row range, and the second term is the
column or column range. If you write this:

num = arr[0,0]

you get the element in row 0, column 0. But you can also specify
ranges for each col or row:

num = arr[1:, 2:]

That says to get all elements from row 1 to the bottom that are in
from column 2 to the end of the row.
Feb 18 '08 #5
On Feb 18, 2:05*pm, 7stud <bbxx789_0...@yahoo.comwrote:
num = arr[1:, 2:]

That says to get all elements from row 1 to the bottom that are in
from column 2 to the end of the row.
err..

That says to get all elements from row 1 to the last row which are in
column 2, column 3, etc. to the end of the row.

Feb 18 '08 #6
On Feb 19, 1:38 am, Robert Kern <robert.k...@gmail.comwrote:
>Averaging color
images is tricky; you really shouldn't do it in the RGB colorspace.
hi,
thanx for the guidance and detailed replies..I tried to pack the
r,g,b into a single value like below(something a member posted in the
past)

def rgbTopixelvalue((r,g,b)):
alpha=255
return unpack("l", pack("BBBB", b, g, r, alpha))[0]
if i apply this for all images i can represent each image as an array
of longs instead of tuples.then for a pixel i can calculate the
average value
after this if i do the casting as you advised and create the avg
image
avgface = avgface.astype(numpy.uint8)
img = Image.fromstring('L', (width, height), avgface.tostring())

is there something wrong with my approach? I am a newbie in PIL/
imageprocessing ..so i would greately appreciate feedback
eric
Feb 19 '08 #7
On Feb 19, 1:38 am, Robert Kern <robert.k...@gmail.comwrote:
>Averaging color
images is tricky; you really shouldn't do it in the RGB colorspace.
hi,
thanx for the guidance and detailed replies..I tried to pack the
r,g,b into a single value like below(something a member posted in the
past)

def rgbTopixelvalue((r,g,b)):
alpha=255
return unpack("l", pack("BBBB", b, g, r, alpha))[0]

if i apply this for all images i can represent each image as an array
of longs instead of tuples.then for a pixel i can calculate the
average value
after this if i do the casting as you advised and create the avg
image
avgface = avgface.astype(numpy.uint8)

here if i use these pixelvalues to create an imag
img =Image.fromstring('RGB', (width, height), avgface.tostring())
it will fail because of -'not enough image data'..is there an
alternative to create average rgb color image ?(i want to keep the rgb
so can't convert to greyscale)

is there something wrong with my approach? I am a newbie in PIL/
imageprocessing ..so i would greately appreciate feedback
eric
Feb 19 '08 #8
En Tue, 19 Feb 2008 04:01:04 -0200, vaneric <va********@gmail.com>
escribió:
On Feb 19, 1:38 am, Robert Kern <robert.k...@gmail.comwrote:
>Averaging color
images is tricky; you really shouldn't do it in the RGB colorspace.

hi,
thanx for the guidance and detailed replies..I tried to pack the
r,g,b into a single value like below(something a member posted in the
past)

def rgbTopixelvalue((r,g,b)):
alpha=255
return unpack("l", pack("BBBB", b, g, r, alpha))[0]
That's much worse than averaging the R,G,B components. First, you have to
omit the alfa value (or set it at the end). Then, consider this example:
(0,0,0)=black and (0,1,0)=almost black, average = (0,0,128) = dark blue, a
total nonsense.

As said above, try to compute using another color space, try HSL. The
colorsys module can transform from/to RGB.

--
Gabriel Genellina

Feb 19 '08 #9
def rgbTopixelvalue((r,g,b)):
alpha=255
return unpack("l", pack("BBBB", b, g, r, alpha))[0]

That's much worse than averaging the R,G,B components.
oops!
the intention was to pack r,g,b components into a single value sothat
calculations like finding covariant matrix of a set of images etc can
be done..(i need to represent each image as an array of values(either
long or float)..i can't work with an array of tuples of ints..
As said above, try to compute using another color space, try HSL. The
colorsys module can transform from/to RGB.
even if i convert from rgb to hsl i will have a tuple(h,s,l) for each
pixel and again i will have to convert it into a single value which i
can use in matrix multipln etc

is there a workaround sothat rgb color images can be worked on? any
advice most welcome..

Feb 19 '08 #10
On Feb 19, 12:13*am, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Tue, 19 Feb 2008 04:01:04 -0200, vaneric <vaneric...@gmail.com*
escribió:
On Feb 19, 1:38 am, Robert Kern <robert.k...@gmail.comwrote:
Averaging color
images is tricky; you really shouldn't do it in the RGB colorspace.
hi,
thanx for the guidance and detailed replies..I *tried *to pack the
r,g,b into a single value like below(something a member posted in the
past)
def rgbTopixelvalue((r,g,b)):
* *alpha=255
* *return unpack("l", pack("BBBB", b, g, r, alpha))[0]

That's much worse than averaging the R,G,B components. First, you have to *
omit the alfa value (or set it at the end). Then, consider this example: *
(0,0,0)=black and (0,1,0)=almost black, average = (0,0,128)
How do you arrive at that average?
Feb 19 '08 #11
On 19 feb, 06:55, 7stud <bbxx789_0...@yahoo.comwrote:
On Feb 19, 12:13*am, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Tue, 19 Feb 2008 04:01:04 -0200, vaneric <vaneric...@gmail.com*
escribió:
On Feb 19, 1:38 am, Robert Kern <robert.k...@gmail.comwrote:
>Averaging color
>images is tricky; you really shouldn't do it in the RGB colorspace.
thanx for the guidance and detailed replies..I *tried *to pack the
r,g,b into a single value like below(something a member posted in the
past)
def rgbTopixelvalue((r,g,b)):
* *alpha=255
* *return unpack("l", pack("BBBB", b, g, r, alpha))[0]
That's much worse than averaging the R,G,B components. First, you have to *
omit the alfa value (or set it at the end). Then, consider this example:*
(0,0,0)=black and (0,1,0)=almost black, average = (0,0,128)

How do you arrive at that average?
(0,0,0) -0, (0,1,0) -256, (0+256)/2=128, 128 -(0,0,128)
(ignoring alpha, or using alpha=0)

--
Gabriel Genellina
Feb 19 '08 #12
On 19 feb, 06:28, vaneric <vaneric...@gmail.comwrote:
def rgbTopixelvalue((r,g,b)):
* *alpha=255
* *return unpack("l", pack("BBBB", b, g, r, alpha))[0]
That's much worse than averaging the R,G,B components.

oops!
the intention was to pack r,g,b components into a single value sothat
calculations like finding covariant matrix of a set of images etc can
be done..(i need to represent each image as an array of *values(either
long or float)..i can't work with an array of tuples of ints..
As said above, try to compute using another color space, try HSL. The
colorsys module can transform from/to RGB.

even if i convert from rgb to hsl i will have a tuple(h,s,l) for each
pixel and again i will have to convert it into a single value which i
can use in matrix multipln etc

is there a workaround sothat rgb color images can be worked on? any
advice most welcome..
a) Work with the 3 components in parallel (that is, use 3 separate
matrices, one for each component, and regenerate the image at the
end).

b) Convert to grayscale (and lose the color information)

--
Gabriel Genellina
Feb 19 '08 #13
>
a) Work with the 3 components in parallel (that is, use 3 separate
matrices, one for each component, and regenerate the image at the
end).
that wd be ok for image generation ..but to calculate covariance
matrix from the set of images i don't know if it wd work

eric
Feb 19 '08 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Sara | last post by:
I am trying to find the average number of products of the set that is on rows...dynamically. For example, if I had states on rows and was looking at the average number of products, I would see...
6
by: J | last post by:
Kind of new at programming/vb.net. I'm doing this junky die roller program. Heres's what is supposed to happen: Roll 2 6-sided dies. Add rolls together put total in rolls(d6total). Display...
4
by: Gary | last post by:
Hi, I have a temperature conversion program down pat, but I was told to add an average, meaning, i need to get the average temperature for as many times as it was entered. i do not know where to...
3
by: C++Geek | last post by:
I need to get this program to average the salaries. What am I doing wrong? //Program to read in employee data and calculate the average salaries of the emplyees.
3
by: simpleeshelbee | last post by:
Hey guys, This is my second post and is URGENT!!!! My final assignment is due tonite for class and I have no idea how to write this program right! I am supposed to write a program that uses a...
3
by: mochatrpl | last post by:
I am looking for a way to make a query / report display the running average for total dollars. I have already set up a query to provide totals dollars per day from which a report graphly shows...
3
by: Salad | last post by:
http://www.mathwords.com/w/weighted_average.htm At the above link gives an example of a weighted average. It uses the following example: Grades are often computed using a weighted average....
3
by: vileoxidation | last post by:
Hello, and thanks for any help in advance! Basically, as the title says, I am looking for a way to print the number of times the user gave the program an input, and then also print the average of...
5
by: p3rk3le | last post by:
So, I'm about to do a sequential search on a table (n contents) of random numbers. I have to print the average between the number of comparisons and the contents of the table (n) and the...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.