Image Pixel Intensity and Measure of Colourfulness in Python

I want to measure the average pixel intensity and measure of colourfulness of a image. For this i'm following this approach (kindly let me know if there's any alternative approach for the same):

a) Calculate Average Pixel Intensity:

im = Image.open('images-16.jpeg')
stat = ImageStat.Stat(im)
r,g,b = stat.mean
mean = sqrt(0.241* (r ** 2) + 0.691* (g ** 2) + 0.068* (b ** 2))
print(mean)

b) To measure colourfulness:

  • Dividing color space into 64 cubic blocks with four equal partitions along each dimension

    w,h=im.size    
    bw,bh = 8, 8 #block size
    img = np.array(im)
    sz = img.itemsize
    shape = (h-bh+1, w-bw+1, bh, bw)
    strides = (w*sz, sz, w*sz, sz) 
    blocks = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
    print (blocks[1,1])
    
  • Calculate Euclidean distances between the geometric centers Ci of each cube i Not able to compute (say d(a,b)=rgb(Ca)-rgb(Cb))

  • Distribution D1 is generated as the color distribution of a hypothetical image such that for each of 64 sample points, the frequency is 1/64 -

    pixels = im.load() all_pixels = [] for x in range(218): #put your block width size for y in range(218): #your block heigh size cpixel = pixels[x, y] all_pixels.append(cpixel)

  • Distribution D2 is computed from the given image by finding the frequency of occurrence of color within each of the 64 cubes How can i do this?

  • Calculate Earth Mover's Distance: (D1,D2,d(a,b)) - d(a,b) is calculated above
  • Is this the right way to do it? Any supporting documents to achieve this? Any help with the code is appreciated. Thanks.


    你将需要pyemd库。

    from pyemd import emd
    import numpy as np
    from PIL import Image
    import skimage.color
    
    im = Image.open("t4.jpg")
    pix = im.load()
    
    h1 = [1.0/64] * 64
    h2 = [0.0] * 64
    hist1 = np.array(h1)
    
    w,h = im.size
    
    for x in xrange(w):
        for y in xrange(h):
            cbin = pix[x,y][0]/64*16 + pix[x,y][1]/64*4 + pix[x,y][2]/64
            h2[cbin]+=1
    hist2 = np.array(h2)/w/h
    
    # compute center of cubes
    
    c = np.zeros((64,3))
    for i in xrange(64):
        b = (i%4) * 64 + 32
        g = (i%16/4) * 64 + 32
        r = (i/16) * 64 + 32
        c[i]=(r,g,b)
    
    c_luv = skimage.color.rgb2luv(c.reshape(8,8,3)).reshape(64,3)
    
    d = np.zeros((64,64))
    
    for x in xrange(64):
        d[x,x]=0
        for y in xrange(x):
            dist = np.sqrt( np.square(c_luv[x,0]-c_luv[y,0]) + 
                       np.square(c_luv[x,1]-c_luv[y,1]) + 
                       np.square(c_luv[x,2]-c_luv[y,2]))
            d[x,y] = dist
            d[y,x] = dist
    
    
    colorfullness = emd(hist1, hist2, d)
    
    print colorfullness
    
    链接地址: http://www.djcxy.com/p/89782.html

    上一篇: opencv中的点像素坐标

    下一篇: Python中图像像素的强度和色彩度量