Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Image Analysis?

Name: Anonymous 2008-05-02 0:10

Sup /prog/

I have a problem whereby I need to identify (with any degree of accuracy) whether or not an image is a resized version of another image. ``Resize'' is defined as a constant aspect-ratio downscale with (hopefully) a cubic sampling. I haven't been able to turn up any reasonable material on image analysis, which means I'm left to my own devices.

I think one viable option might be to consider the proportions of colors within the image. A ``color'', for my purposes, is defined as a set of three ranges (one range for each RGB channel). The algorithm would essentially go through each pixel, keeping a tally of how many of each color there are, then sort by occurance. Two images with similar proportions of the top 5 colors or so are flagged as identical.

The colors would necessarily be ranges because of the cubic sampling -- since one of the images is a downscaled version of another, the set of colors from the two images won't be the same. A pathological example: a large image consisting of alternating white and black pixels gets downscaled, the resultant image has gray -- a color which was not present in the original image.

I had some other weird ideas, like taking the diagonals, downscale one at runtime to fit the other, then compare the deltas.

I dunno. Anyone have ideas/suggestions/links?

Name: Anonymous 2008-05-02 12:40

Comparing images is really simple with PIL, it's got a histogram() function built in. No resizing nonsense needed.


import Image, operator, math, sys

def imgdiff(f1, f2):
        i1 = Image.open(f1)
        i2 = Image.open(f2)
        if i1.mode != i2.mode:
                i1 = i1.convert("RGBA")
                i2 = i2.convert("RGBA")
        h1 = i1.histogram()
        h2 = i2.histogram()
        return math.sqrt(reduce(operator.add,
                map(lambda a, b: (a - b) ** 2, h1, h2)) / len(h1))
if __name__ == '__main__':
        if len(sys.argv) != 3:
                print "usage: %s <first-image> <second-image>" % sys.argv[0]
        else:
                print imgdiff(sys.argv[1], sys.argv[2])

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List