From cc06817efa24f20811ef6b32143c6700a91c5f2a Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Fri, 11 Apr 2014 08:00:27 +0000
Subject: [PATCH] Attempt at visualizing ImageNet Features

---
 src/image.c |  144 +++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 130 insertions(+), 14 deletions(-)

diff --git a/src/image.c b/src/image.c
index 460df3d..5c138d3 100644
--- a/src/image.c
+++ b/src/image.c
@@ -4,6 +4,21 @@
 
 int windows = 0;
 
+image image_distance(image a, image b)
+{
+    int i,j;
+    image dist = make_image(a.h, a.w, 1);
+    for(i = 0; i < a.c; ++i){
+        for(j = 0; j < a.h*a.w; ++j){
+            dist.data[j] += pow(a.data[i*a.h*a.w+j]-b.data[i*a.h*a.w+j],2);
+        }
+    }
+    for(j = 0; j < a.h*a.w; ++j){
+        dist.data[j] = sqrt(dist.data[j]);
+    }
+    return dist;
+}
+
 void subtract_image(image a, image b)
 {
     int i;
@@ -98,6 +113,7 @@
     return copy;
 }
 
+
 void show_image(image p, char *name)
 {
     int i,j,k;
@@ -121,7 +137,7 @@
         }
     }
     free_image(copy);
-    if(disp->height < 500 || disp->width < 500){
+    if(disp->height < 500 || disp->width < 500 || disp->height > 1000){
         int w = 1500;
         int h = w*p.h/p.w;
         if(h > 1000){
@@ -137,6 +153,30 @@
     cvReleaseImage(&disp);
 }
 
+void save_image(image p, char *name)
+{
+    int i,j,k;
+    image copy = copy_image(p);
+    normalize_image(copy);
+
+    char buff[256];
+    //sprintf(buff, "%s (%d)", name, windows);
+    sprintf(buff, "%s.png", name);
+
+    IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c);
+    int step = disp->widthStep;
+    for(i = 0; i < p.h; ++i){
+        for(j = 0; j < p.w; ++j){
+            for(k= 0; k < p.c; ++k){
+                disp->imageData[i*step + j*p.c + k] = (unsigned char)(get_pixel(copy,i,j,k)*255);
+            }
+        }
+    }
+    free_image(copy);
+    cvSaveImage(buff, disp,0);
+    cvReleaseImage(&disp);
+}
+
 void show_image_layers(image p, char *name)
 {
     int i;
@@ -212,6 +252,18 @@
     return out;
 }
 
+void add_into_image(image src, image dest, int h, int w)
+{
+    int i,j,k;
+    for(k = 0; k < src.c; ++k){
+        for(i = 0; i < src.h; ++i){
+            for(j = 0; j < src.w; ++j){
+                add_pixel(dest, h+i, w+j, k, get_pixel(src, i, j, k));
+            }
+        }
+    }
+}
+
 void add_scalar_image(image m, float s)
 {
     int i;
@@ -342,21 +394,11 @@
     return outImg;
 }
 
-image load_image(char *filename, int h, int w)
+image ipl_to_image(IplImage* src)
 {
-    IplImage* src = 0;
-    if( (src = cvLoadImage(filename,-1)) == 0 )
-    {
-        printf("Cannot load file image %s\n", filename);
-        exit(0);
-    }
-    cvShowImage("Orig", src);
-    IplImage *resized = resizeImage(src, h, w, 1);
-    cvShowImage("Sized", resized);
-    cvWaitKey(0);
-    cvReleaseImage(&src);
-    src = resized;
     unsigned char *data = (unsigned char *)src->imageData;
+    int h = src->height;
+    int w = src->width;
     int c = src->nChannels;
     int step = src->widthStep;
     image out = make_image(h,w,c);
@@ -369,6 +411,23 @@
             }
         }
     }
+    return out;
+}
+
+image load_image(char *filename, int h, int w)
+{
+    IplImage* src = 0;
+    if( (src = cvLoadImage(filename,-1)) == 0 )
+    {
+        printf("Cannot load file image %s\n", filename);
+        exit(0);
+    }
+    if(h && w ){
+        IplImage *resized = resizeImage(src, h, w, 1);
+        cvReleaseImage(&src);
+        src = resized;
+    }
+    image out = ipl_to_image(src);
     cvReleaseImage(&src);
     return out;
 }
@@ -382,6 +441,20 @@
     }
     return out;
 }
+image get_sub_image(image m, int h, int w, int dh, int dw)
+{
+    image out = make_image(dh, dw, m.c);
+    int i,j,k;
+    for(k = 0; k < out.c; ++k){
+        for(i = 0; i < dh; ++i){
+            for(j = 0; j < dw; ++j){
+                float val = get_pixel(m, h+i, w+j, k);
+                set_pixel(out, i, j, k, val);
+            }
+        }
+    }
+    return out;
+}
 
 float get_pixel(image m, int x, int y, int c)
 {
@@ -573,6 +646,49 @@
     printf("\n");
 }
 
+image collapse_images(image *ims, int n)
+{
+    int color = 1;
+    int border = 1;
+    int h,w,c;
+    int size = ims[0].h;
+    h = size;
+    w = (size + border) * n - border;
+    c = ims[0].c;
+    if(c != 3 || !color){
+        h = (h+border)*c - border;
+        c = 1;
+    }
+
+    image filters = make_image(h,w,c);
+    int i,j;
+    for(i = 0; i < n; ++i){
+        int w_offset = i*(size+border);
+        image copy = copy_image(ims[i]);
+        normalize_image(copy);
+        if(c == 3 && color){
+            embed_image(copy, filters, 0, w_offset);
+        }
+        else{
+            for(j = 0; j < copy.c; ++j){
+                int h_offset = j*(size+border);
+                image layer = get_image_layer(copy, j);
+                embed_image(layer, filters, h_offset, w_offset);
+                free_image(layer);
+            }
+        }
+        free_image(copy);
+    }
+    return filters;
+} 
+
+void show_images(image *ims, int n, char *window)
+{
+    image m = collapse_images(ims, n);
+    show_image(m, window);
+    free_image(m);
+}
+
 void free_image(image m)
 {
     free(m.data);

--
Gitblit v1.10.0