I am looking for an unique signature of an image. Better if computationally less costly. Image set I am working with shows brightness variations and at times even scaling & translation.
The most signature of an images is strongly depend on your application and what do you want from that feature. in some applications, histogram of a photometric color space can be suitable however in other applications more complicated computation require for extracting distinctive signature/feature.
If you give us more information about your application we can suggest you better tool for your project.
Parul Shah, I do not understand why you say that the histogram will change when the image is rotated. How can a histogram change when an image is rotated?
The most unique signature of an image is the value of every single pixel in the correct order. But I do not think you want this. You want a compressed signature, smaller is size than the image, rotation-invariant and perhaps shift-invariant too? I suppose you have looked at Fourier and Wavelet transforms?
You ask for MOST unique... Something is unique or not. I tend to agree with David: the uniqueness is the value and order of pixels.
I guess the number of bytes you want to use to store the 'uniqueness' is crucial. If you use only one integer, I would go for a CRC, which can be used for any data, not specifically images.
Do you really mean that the signature should change even if the image is rotated? Or do you mean that the signature should NOT change if the image is rotated? If the later, I agree with Mr Cornforth that it seems as you are looking for rotation-invariant features of some sorts.
I want the signature to CHANGE if the image is rotated or flipped (mirror image) i.e. a flipped image or rotated image is a different image for me. A small amount of translation or scaling can be considered as the same image and hence same signature. So it might be shift invariant (small shift) but not rotation-invariant.
Let me rephrase it as unique (may be not most unique) signature.
Yes, I need a smaller signature, easy to store and match.
Histogram is not a signature of an image and so cannot be used here (it will not only change if the image is rotated but two completely different image can also have the same histogram).
There have been great answers here. Just in case, please note the following issues:
1. SIFT, SURF, and ORB are NOT image features.
They are local features, i.e. features of a very local region in an image. To generate a signature for an image, one usually uses a bag-of-visual-word (BOVW) model based on local features. Please refer to the following links for more details.
There are two ways to obtain the local regions, from which SIFT etc. will be extracted. One is to use keypoint detector, e.g. Hessian Affine or MSER etc. Another is to densely sampling local regions from the image. Please google using keywords like "keypoint detection BOVW" and "Dense Sampling BOVW".
2. SIFT, SURF, and ORB are rotation INVARIANT.
But you can make them rotation variant by fixing the orientation of the local region. Please refer to the following link for what the orientation of a local region is.
http://www.vlfeat.org/overview/sift.html
You can use the tool in the VLFeat library for dense sampling based SIFT extraction.
3. BOVW is expensive in terms of offline indexing.
The online speed of BOVW-based image matching is OK. But the offline processing includes visual vocabulary construction and visual word assignment. The former can be achieved by approximated k-means, and the latter by approximated nearest neighbor search. Depending on the size of your dataset, these two steps can be very slow.
If you only care about online speed, then you can ignore this issue.
A question out of curiosity to the SIFT, SURF, ORB and BOVW guru's : how many bytes are needed to store those unique signatures of e.g. a 1 MB color portrait?
I am not a guru of this field, but maybe I can share some of my experience.
The signature size depends on the image resolution and how we sample the local regions.
Given a 1024x768 image and a Hessian Affine detector, the number of keypoints range from 1,000 to 10,000, averagely 3,000. If we use standard TF-IDF weighting, the signature will contain around 3,000 doubles, i.e. 3,000x8=24,000 bytes.
Just in case, the BOVW representation is usually a real feature vector, NOT a signature. If you need a signature, you may have to binarize it using PCA hashing, spectral hashing, or etc. I am not familiar with this issue, so there maybe better solutions.
The second question is hard.
The uniqueness of BOVW depends on the application, the dataset, the definition of "same" images, and the type of variations between "same" images.
Let's just consider standard BOVW with TF-IDF and forget signature. Suppose that the task is object retrieval. Given a small dataset with 5,000 images of say buildings or logos, the mean average precision (MAP) of retrieving this dataset ranges from 50% to 70%. Adding a number of non-trivial pre- and post-processings can boost the MAP to 80% to 90%.