1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.openimaj.demos;
31
32 import java.net.URL;
33
34 import org.openimaj.feature.DoubleFV;
35 import org.openimaj.feature.DoubleFVComparison;
36 import org.openimaj.image.DisplayUtilities;
37 import org.openimaj.image.ImageUtilities;
38 import org.openimaj.image.MBFImage;
39 import org.openimaj.image.colour.ColourSpace;
40 import org.openimaj.image.dataset.FlickrImageDataset;
41 import org.openimaj.image.pixel.statistics.HistogramModel;
42 import org.openimaj.math.geometry.point.Point2d;
43 import org.openimaj.math.geometry.transforms.TransformUtilities;
44 import org.openimaj.math.matrix.similarity.SimilarityMatrix;
45 import org.openimaj.math.matrix.similarity.processor.MultidimensionalScaling;
46 import org.openimaj.util.api.auth.DefaultTokenFactory;
47 import org.openimaj.util.api.auth.common.FlickrAPIToken;
48 import org.openimaj.util.pair.IndependentPair;
49
50 public class ImageFeatureMDS {
51 public static void main(String[] args) throws Exception {
52 final FlickrAPIToken token = DefaultTokenFactory.getInstance().getToken(FlickrAPIToken.class);
53 final int numImages = 20;
54
55 final FlickrImageDataset<MBFImage> dataset = FlickrImageDataset.create(ImageUtilities.MBFIMAGE_READER, token,
56 "colorful", numImages);
57
58 dataset.getPhotos().set(1, dataset.getPhoto(0));
59
60 final DoubleFV[] features = new DoubleFV[numImages];
61 for (int i = 0; i < numImages; i++) {
62 features[i] = extractFeature(dataset.get(i));
63 }
64
65 final SimilarityMatrix matrix = new SimilarityMatrix(numImages);
66 for (int i = 0; i < numImages; i++) {
67 matrix.setIndexValue(i, dataset.getID(i));
68 final DoubleFV fi = features[i];
69
70 for (int j = 0; j < numImages; j++) {
71 final DoubleFV fj = features[j];
72
73 matrix.set(i, j, fi.compare(fj, DoubleFVComparison.COSINE_SIM));
74 }
75 }
76
77 System.out.println(matrix);
78
79 final MultidimensionalScaling mds = new MultidimensionalScaling();
80 mds.process(matrix);
81 System.out.println(mds.getPoints());
82
83 final MBFImage img = new MBFImage(1000, 1000, ColourSpace.RGB);
84 for (final IndependentPair<String, Point2d> pt : mds.getPoints()) {
85
86
87 final int idx = dataset.indexOfID(pt.firstObject());
88 final MBFImage thumb = ImageUtilities.readMBF(new URL(dataset.getPhoto(idx).getThumbnailUrl()));
89 img.drawImage(thumb, pt.getSecondObject().transform(TransformUtilities.scaleMatrix(1000, 1000)));
90 }
91 DisplayUtilities.display(img);
92 }
93
94 static DoubleFV extractFeature(MBFImage image) {
95 final HistogramModel model = new HistogramModel(4, 4, 4);
96
97 model.estimateModel(image);
98
99 return model.histogram.normaliseFV();
100 }
101 }