diff --git a/Originals.tif b/Originals.tif new file mode 100644 index 0000000..03fffb2 Binary files /dev/null and b/Originals.tif differ diff --git a/README.md b/README.md index a9d0d27..7511884 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ # Computer vision lab This repository will contain guides and scripts required during the lab. +ok ok ok ok diff --git a/Retoques.tif b/Retoques.tif new file mode 100644 index 0000000..b13d280 Binary files /dev/null and b/Retoques.tif differ diff --git a/lab01_git/questions.md b/lab01_git/questions.md index c9af08a..a7c7043 100644 --- a/lab01_git/questions.md +++ b/lab01_git/questions.md @@ -1,7 +1,7 @@ # Warmup Questions 1. What is the clone url of this repository? - > answer + > https://github.com/PardoAlejo/lab_vision 2. What is the output of the ``cal`` command? @@ -12,46 +12,47 @@ # Homework Questions 1. What is the ``grep``command? - > answer + > grep allows to look for a command in the code, and helps to make many actions, like print in the screen, count the number of matches, and look for complexes combinations of strings. 2. What is a *makefile*? - > answer + > Is the file that allow the project to be build. 4. What does the ``-prune`` option of ``find`` do? Give an example - > answer + > prune option help to find what we are looking for, without search in all subdirectories or without look in a particular subdirectory. 5. Where is the ``grub.cfg`` file - > answer + > This is the default boot loader and launcher of ubuntu, and it is in /boot/grub/grub.cfg. 6. How many files with ``gnu`` in its name are in ``/usr/src`` - > answer + > 0 files using find /usr/src/ - gnu | wc -l. 7. How many files contain the word ``gpl`` inside in ``/usr/src`` - > answer + > 844 files, by using: grep -irm 1 "gpl" /usr/src/ | wc -l + 8. What does the ``cut`` command do? - > answer + > with the command cut, you can "cut" the number of characters to the number of characters that you want. 9. What does the ``wget`` command do? - > answer + > this command follow links of the web and download files, also can create local versions of websites, recreating the directoy of the original file, in order to prevents you to repeat the same processes in the same website many times. 9. What does the ``rsync`` command do? - > answer + > rsync allows to transfer just the differences between two sets of files across the network link, 10. What does the ``diff`` command do? - > answer + > Diff command analize a couple of files and print on the screen the lines which both are different. 10. What does the ``tail`` command do? - > answer + > read the last lines of a file and write them as an output. 10. What does the ``tail -f`` command do? - > answer + > with the additional -f, allows to the file to be monitored, if the file is modified by another process, tail shows in the display the changes, it is mainly use to monitor log files. 10. What does the ``link`` command do? - > answer + > Links two files, and in consecuence any change in one of the files affects the other one. It link the files puting them in the same place of the disk. 11. How many users exist in the course server? - > answer + > 8 12. What command will produce a table of Users and Shells sorted by shell (tip: using ``cut`` and ``sort``) > answer diff --git a/lab01_git/readme.md b/lab01_git/readme.md index c996386..49e62d2 100644 --- a/lab01_git/readme.md +++ b/lab01_git/readme.md @@ -4,7 +4,7 @@ - Read about version control and Git (sections 1.1 - 1.4) http://git-scm.com/book/en/v2/Getting-Started-About-Version-Control - +asd ## Basics ### Create a repository diff --git a/lab3_hybrid/data/bicycle.bmp b/lab3_hybrid/data/bicycle.bmp new file mode 100644 index 0000000..26a761a Binary files /dev/null and b/lab3_hybrid/data/bicycle.bmp differ diff --git a/lab3_hybrid/data/bird.bmp b/lab3_hybrid/data/bird.bmp new file mode 100644 index 0000000..b82cc80 Binary files /dev/null and b/lab3_hybrid/data/bird.bmp differ diff --git a/lab3_hybrid/data/cat.bmp b/lab3_hybrid/data/cat.bmp new file mode 100644 index 0000000..d0dcaea Binary files /dev/null and b/lab3_hybrid/data/cat.bmp differ diff --git a/lab3_hybrid/data/dog.bmp b/lab3_hybrid/data/dog.bmp new file mode 100644 index 0000000..d5b2df5 Binary files /dev/null and b/lab3_hybrid/data/dog.bmp differ diff --git a/lab3_hybrid/data/einstein.bmp b/lab3_hybrid/data/einstein.bmp new file mode 100644 index 0000000..8f2866f Binary files /dev/null and b/lab3_hybrid/data/einstein.bmp differ diff --git a/lab3_hybrid/data/fish.bmp b/lab3_hybrid/data/fish.bmp new file mode 100644 index 0000000..b12bbe2 Binary files /dev/null and b/lab3_hybrid/data/fish.bmp differ diff --git a/lab3_hybrid/data/marilyn.bmp b/lab3_hybrid/data/marilyn.bmp new file mode 100644 index 0000000..55c3f34 Binary files /dev/null and b/lab3_hybrid/data/marilyn.bmp differ diff --git a/lab3_hybrid/data/motorcycle.bmp b/lab3_hybrid/data/motorcycle.bmp new file mode 100644 index 0000000..2daeaee Binary files /dev/null and b/lab3_hybrid/data/motorcycle.bmp differ diff --git a/lab3_hybrid/data/plane.bmp b/lab3_hybrid/data/plane.bmp new file mode 100644 index 0000000..8d0fd23 Binary files /dev/null and b/lab3_hybrid/data/plane.bmp differ diff --git a/lab3_hybrid/data/submarine.bmp b/lab3_hybrid/data/submarine.bmp new file mode 100644 index 0000000..4edf019 Binary files /dev/null and b/lab3_hybrid/data/submarine.bmp differ diff --git a/lab3_hybrid/modified.jpg b/lab3_hybrid/modified.jpg new file mode 100644 index 0000000..a7f3114 Binary files /dev/null and b/lab3_hybrid/modified.jpg differ diff --git a/lab3_hybrid/originals.jpg b/lab3_hybrid/originals.jpg new file mode 100644 index 0000000..7ccd13d Binary files /dev/null and b/lab3_hybrid/originals.jpg differ diff --git a/lab3_hybrid/pyramid.jpg b/lab3_hybrid/pyramid.jpg new file mode 100644 index 0000000..f072394 Binary files /dev/null and b/lab3_hybrid/pyramid.jpg differ diff --git a/lab3_hybrid/readme.md b/lab3_hybrid/readme.md index afef568..30a85b1 100644 --- a/lab3_hybrid/readme.md +++ b/lab3_hybrid/readme.md @@ -69,13 +69,76 @@ Create a hybrid image based on images from your own collections. The more origin Notice that you will have to *align and crop* the images to get a good effect. To do this you may use image edition software like gimp or photoshop. You are free to do any additional processing that you want in order to increase the effect. Also consider how to deal with color on the images. + + Finally, upload to the repository +These are my results: + - The original images + ![originales](originals.jpg) +- My girlfriend and me. - The processed images (cropped, aligned, color adjusted) -- A short description of each image (one paragraph) + ![Processed images](modified.jpg) +- For my girlfriend image I enhaced the contrast of the image, multiplying it by a constant >1 to give it more importance because it was going to be the image with the high frequencies and I realized that in this two photos the low frequency dominated. On the other hand, for my image I multiplied it by a constant <1 to reduce the contast and increase the effect of the hybrid image. + - The final hybrid image + ![Processed images](result.jpg) +- This is the result after take both , high and low frequencies and mixed up the images. + - The pyramid + ![Processed images](pyramid.jpg) +- Pyramid to see the effect of low and high frequencies. - The code you used (with comments) +CODE: + +% this is the code for make hybrid images by Alejandro Pardo +clc;clear all; close all; +%Add path of the functions +addpath(genpath('proj1')); + +%Read the images +original_down=im2double(imread('IMG_1671.jpg')); +original_up=im2double(imread('IMG_1669.jpg')); + +%Process the images before the transformation +down=0.4*original_down; +up=1.2*original_up; + +%Cutoff frequencies, parameters of the filter +cutoff=7; +cutoff1=7; + +%Filter masks, tipe gaussian, with variance as a function of the cutoff +%frequencies, resulting by the analysis of the convolution. the scale +%factor that multiplies the cutoff frequency is the one that set the +%overlaping of the frequencies of the images, this factor basically +%determines how the images are combined each other. The window size was 9x9 +h=fspecial('gaussian',cutoff*3+1,9); +h1=fspecial('gaussian',cutoff1*3+1,9); + +%Get the low frequencies of the image 1 +god=imfilter(down,h); + +%Get the high frequencies of the image 2 +tac=imfilter(up,h1); +tac=(up-tac); + +%Combine the images to generate the hybrid result +result=god+tac; + +%Results visualization +figure; +subplot(1,2,1);imshow(original_down);title('Original Image low frequencies'); +subplot(1,2,2);imshow(original_up);title('Original Image high frequencies'); +figure; +subplot(1,2,1);imshow(down);title('Adjusted Image low frequencies'); +subplot(1,2,2);imshow(up);title('Adjusted Image high frequencies'); +figure +imshow(vis_hybrid_image(result));title('Pyramid') +figure +imshow(result);title('Result'); + + **DUE**: 3 /3 /2016 ; 10:00 a.m. diff --git a/lab3_hybrid/result.jpg b/lab3_hybrid/result.jpg new file mode 100644 index 0000000..465cffc Binary files /dev/null and b/lab3_hybrid/result.jpg differ diff --git a/lab4_segmentation/segment_by_clustering.m b/lab4_segmentation/segment_by_clustering.m new file mode 100644 index 0000000..68820dc --- /dev/null +++ b/lab4_segmentation/segment_by_clustering.m @@ -0,0 +1,98 @@ +function labels = segment_by_clustering(im,space,method,k) + +%This function generates an RGB image segmentation in k clusters +%Space: color space used for segmentation. Posible entries: 'rgb' 'lab' 'hsv' 'rgb+xy' 'lab+xy' 'hsv+xy' +%Method: method used for segmentation. Possible entries: 'kmeans' 'gmm' +%'watershed' 'hierarchical' + + +%color spaces +scale_factor=2; +if strcmp(method,'hierarchical') +im=imresize(im,1/scale_factor); +end + +im=im2double(im); +[n,m,z]=size(im); + +%rgb +imrgb=im./(max(im(:))); +%lab +cform = makecform('srgb2lab'); +imlab = applycform(im,cform); +imlab=imlab-(min(imlab(:))).*ones(size(imlab)); +imlab=imlab./(max(imlab(:))); +%hsv +imhsv=rgb2hsv(im); +imhsv=imhsv./((max(imlab(:)))); +%xy feature +[y,x]=meshgrid(1:m,1:n); +xm=reshape(x,n*m,1);xm=0.4*xm./max(xm(:)); +ym=reshape(y,n*m,1);ym=0.4*ym./max(ym(:)); + +%Chose de color space +if strcmp(space,'rgb') + imn=reshape(imrgb,n*m,3); + my=[imn]; +elseif strcmp(space,'rgb+xy') + imn=reshape(imrgb,n*m,3); + my=[imn xm ym]; +elseif strcmp(space,'lab') + imn=reshape(imlab,n*m,3); + my=[imn]; +elseif strcmp(space,'lab+xy') + imn=reshape(imlab,n*m,3); + my=[imn xm ym]; +elseif strcmp(space,'hsv') + imn=reshape(imhsv,n*m,3); + my=[imn]; +elseif strcmp(space,'hsv+xy') + imn=reshape(imhsv,n*m,3); + my=[imn xm ym]; +else + error('Invalid space input') +end + +%Chose the method +if strcmp(method,'kmeans') + + [idx]=kmeans(my,k); + labels=reshape(idx,n,m); + +elseif strcmp(method,'gmm') + + obj = fitgmdist(my,k); + idx = cluster(obj,my); + labels=reshape(idx,n,m); + +elseif strcmp(method,'watershed') + + im_gray = rgb2gray(im(:,:,1:3)); + + %gradient’s magnitude + hy = fspecial('sobel'); + hx = hy'; + Iy = imfilter(im2double(im_gray), hy, 'replicate'); + Ix = imfilter(im2double(im_gray), hx, 'replicate'); + grad = sqrt(Ix.^2 + Iy.^2); + + %Markers for extended minima + marker = imextendedmin(grad, k); + %Impose minima + new_grad = imimposemin(grad, marker); + %Watershe calculation + labels = watershed(new_grad); + +elseif strcmp(method,'hierarchical') + + idx=clusterdata(my,'distance','euclidean','linkage','ward',... + 'savememory','on','maxclust',k); + + labels=reshape(idx,n,m); + labels=imresize(labels,scale_factor); +else + error('Invalid method input') +end + +imshow(labels,[]);title('Segmented Image') +end \ No newline at end of file diff --git a/lab8_cnn/0b52dff5-841d-4780-b807-b6542761d1d9.jpeg b/lab8_cnn/0b52dff5-841d-4780-b807-b6542761d1d9.jpeg new file mode 100644 index 0000000..124c20e Binary files /dev/null and b/lab8_cnn/0b52dff5-841d-4780-b807-b6542761d1d9.jpeg differ diff --git a/lab8_cnn/getBatchWithJitter.m b/lab8_cnn/getBatchWithJitter.m new file mode 100644 index 0000000..74b095f --- /dev/null +++ b/lab8_cnn/getBatchWithJitter.m @@ -0,0 +1,31 @@ +% -------------------------------------------------------------------- +function [im, labels] = getBatchWithJitter(imdb, batch) +% -------------------------------------------------------------------- +im = imdb.images.data(:,:,batch) ; +labels = imdb.images.label(1,batch) ; + +n = numel(batch) ; +train = find(imdb.images.set == 1) ; + +sel = randperm(numel(train), n) ; +im1 = imdb.images.data(:,:,sel) ; + +sel = randperm(numel(train), n) ; +im2 = imdb.images.data(:,:,sel) ; + +ctx = [im1 im2] ; +ctx(:,17:48,:) = min(ctx(:,17:48,:), im) ; + +dx = randi(11) - 6 ; +im = ctx(:,(17:48)+dx,:) ; +sx = (17:48) + dx ; + +dy = randi(5) - 2 ; +sy = max(1, min(32, (1:32) + dy)) ; + +im = ctx(sy,sx,:) ; + +% Visualize the batch: +% figure(100) ; clf ; + +im = 256 * reshape(im, 32, 32, 1, []) ; diff --git a/lab8_cnn/initializeCNN.m b/lab8_cnn/initializeCNN.m new file mode 100644 index 0000000..b66ab72 --- /dev/null +++ b/lab8_cnn/initializeCNN.m @@ -0,0 +1,73 @@ +function net = initializeCNN() + +f=1/100 ; +net.layers = {} ; + +%Layer 1: Convolutional layer. Input size: 32x32 + +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(5,5,1,20, 'single'), ... + 'biases', zeros(1, 20, 'single'), ... + 'stride', 1, ... + 'pad', 0) ; +%Layer 2: Pooling layer. Input size: 28x28x20 +net.layers{end+1} = struct('type', 'pool', ... + 'method', 'max', ... + 'pool', [2 2], ... + 'stride', 2, ... + 'pad', 0) ; +%Layer 3: Convoluting layer. Input size: 28x28x20 +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(4,4,50,500, 'single'),... + 'biases', zeros(1,500,'single'), ... + 'stride', 1, ... + 'pad', 0) ; +%Layer 4. Input size: 24x24x20x500 +net.layers{end+1} = struct('type', 'relu') ; + +%Layer 5: Convolutional layer. Input: 24x240000 +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(2,2,500,750, 'single'),... + 'biases', zeros(1,750,'single'), ... + 'stride', 1, ... + 'pad', 0) ; + +%Layer 6 Input: 20x240996x750 +net.layers{end+1} = struct('type', 'softmaxloss'); + + + +% f=1/100 ; +% net.layers = {} ; +% net.layers{end+1} = struct('type', 'conv', ... +% 'filters', f*randn(5,5,1,20, 'single'), ... +% 'biases', zeros(1, 20, 'single'), ... +% 'stride', 1, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'pool', ... +% 'method', 'max', ... +% 'pool', [2 2], ... +% 'stride', 2, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'conv', ... +% 'filters', f*randn(5,5,20,50, 'single'),... +% 'biases', zeros(1,50,'single'), ... +% 'stride', 1, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'pool', ... +% 'method', 'max', ... +% 'pool', [2 2], ... +% 'stride', 2, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'conv', ... +% 'filters', f*randn(4,4,50,500, 'single'),... +% 'biases', zeros(1,500,'single'), ... +% 'stride', 1, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'relu') ; +% net.layers{end+1} = struct('type', 'conv', ... +% 'filters', f*randn(2,2,500,26, 'single'),... +% 'biases', zeros(1,26,'single'), ... +% 'stride', 1, ... +% 'pad', 0) ; +% net.layers{end+1} = struct('type', 'softmaxloss') ; diff --git a/lab8_cnn/initializeCharacterCNN.m b/lab8_cnn/initializeCharacterCNN.m new file mode 100644 index 0000000..e3a51ad --- /dev/null +++ b/lab8_cnn/initializeCharacterCNN.m @@ -0,0 +1,36 @@ +function net = initializeCharacterCNN() + +f=1/100 ; +net.layers = {} ; +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(5,5,1,20, 'single'), ... + 'biases', zeros(1, 20, 'single'), ... + 'stride', 1, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'pool', ... + 'method', 'max', ... + 'pool', [2 2], ... + 'stride', 2, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(5,5,20,50, 'single'),... + 'biases', zeros(1,50,'single'), ... + 'stride', 1, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'pool', ... + 'method', 'max', ... + 'pool', [2 2], ... + 'stride', 2, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(4,4,50,500, 'single'),... + 'biases', zeros(1,500,'single'), ... + 'stride', 1, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'relu') ; +net.layers{end+1} = struct('type', 'conv', ... + 'filters', f*randn(2,2,500,26, 'single'),... + 'biases', zeros(1,26,'single'), ... + 'stride', 1, ... + 'pad', 0) ; +net.layers{end+1} = struct('type', 'softmaxloss') ; diff --git a/lab8_cnn/report.md b/lab8_cnn/report.md new file mode 100644 index 0000000..03b351f --- /dev/null +++ b/lab8_cnn/report.md @@ -0,0 +1,25 @@ +1. Network Description + +Our neural network is formed by 5, the structure is shown below: + +![Structure Of Neural network](0b52dff5-841d-4780-b807-b6542761d1d9.jpeg) + +The three convolutional layers are used to extract specific patterns inside the input images. This is made by calculting image responses to different filters created previously. +Additionally, the pooling layers were implemented in order obtain relevant information in each of the images. This information results relevant because it represents interest points inside the image regardless its scale. This layers makes a non-linesr subsampling which consists in partitioning the input image into a group pf non-overlapping patches and then extracting de maximum value for each created subregion. This is made in order to reduce the computaion os the upper layers and for to get invariance translation. +The idea of using both layers in a mixed way (one after the other) is to complimment both information in order to have a better representation of the image That could be useful to classify it. + +2. Results + +Results on Train set are shown below: + +![Train](trainm.png) + +We obtained an AP of 0.04. + +Results on the Validation set are shown below: + +![Validation](testm.png) + +We obtained and AP of 0.0157 + +Time spended in the training stage was 0.38hours, 22,8 minutes. diff --git a/lab8_cnn/testm.png b/lab8_cnn/testm.png new file mode 100644 index 0000000..d68682f Binary files /dev/null and b/lab8_cnn/testm.png differ diff --git a/lab8_cnn/train1.m b/lab8_cnn/train1.m new file mode 100644 index 0000000..8d918b4 --- /dev/null +++ b/lab8_cnn/train1.m @@ -0,0 +1,86 @@ +function train(varargin) +setup ; + + +% ------------------------------------------------------------------------- +% Initialize a CNN architecture +% ------------------------------------------------------------------------- + +net = initializeCharacterCNN() ; + +% ------------------------------------------------------------------------- +% Train and evaluate the CNN +% ------------------------------------------------------------------------- + +trainOpts.batchSize = 150 ; +trainOpts.numEpochs = 5 ; +trainOpts.continue = true ; +trainOpts.learningRate = 0.001 ; +trainOpts.expDir = 'data/textures-jit-experimen-t-1' ; +trainOpts = vl_argparse(trainOpts, varargin); + +%Training set +imdb=load('textonsdb2.mat'); +t_idx=find(imdb.images.set == 1); %indices de las imagenes pertenecientes al set de train +imdb.images.data=imdb.images.data(:,:,t_idx); +imdb.images.set=imdb.images.set(t_idx); +imdb.images.label=imdb.images.label(t_idx); + +% Take the average image out +imageMean = mean(imdb.images.data(:)) ; +imdb.images.data = single(imresize(imdb.images.data - imageMean,[32 32])) ; + + +% Initlialize a new network +net = initializeCharacterCNN() ; + +% Call training function in MatConvNet +[net,info] = cnn_train(net, imdb, @getBatchWithJitter, trainOpts) ; + +% Move the CNN back to CPU if it was trained on GPU + + +% Save the result for later use +net.layers(end) = [] ; +net.imageMean = imageMean ; +save('data/textures-experiment/texturescnn-jit-1.mat', '-struct', 'net') ; + +% -------------------------------------------------------------------- +function [im, labels] = getBatch(imdb, batch) +% -------------------------------------------------------------------- +im = imdb.images.data(:,:,batch) ; +im = 256 * reshape(im, 32, 32, 1, []) ; +labels = imdb.images.label(1,batch) ; + +% -------------------------------------------------------------------- +function [im, labels] = getBatchWithJitter(imdb, batch) +% -------------------------------------------------------------------- +im = imdb.images.data(:,:,batch) ; +labels = imdb.images.label(1,batch) ; + +n = numel(batch) ; +train = find(imdb.images.set == 1) ; + +sel = randperm(numel(train), n) ; +im1 = imdb.images.data(:,:,sel) ; + +sel = randperm(numel(train), n) ; +im2 = imdb.images.data(:,:,sel) ; + +ctx = [im1 im2] ; +ctx(:,17:48,:) = min(ctx(:,17:48,:), im) ; + +dx = randi(11) - 6 ; +im = ctx(:,(17:48)+dx,:) ; +sx = (17:48) + dx ; + +dy = randi(5) - 2 ; +sy = max(1, min(32, (1:32) + dy)) ; + +im = ctx(sy,sx,:) ; + +% Visualize the batch: +% figure(100) ; clf ; +% vl_imarraysc(im) ; + +im = 256 * reshape(im, 32, 32, 1, []) ; diff --git a/lab8_cnn/train_net.m b/lab8_cnn/train_net.m new file mode 100644 index 0000000..163098c --- /dev/null +++ b/lab8_cnn/train_net.m @@ -0,0 +1,30 @@ +function res=train_net(net,test_data) +% EXERCISE5 Part 5 of the VGG CNN practical + +setup; + +imdb=test_data; + +for i=1:1:size(imdb.images.data,3) + +im=imdb.images.data(:,:,i); +im_ = single(im) ; % note: 255 range +im_ = imresize(im_, [32 32]) ; +im_ = im_ - net.imageMean ; + +% run the CNN +res = vl_simplenn(net, im_) ; + +% show the classification result +scores = squeeze(gather(res(end).x)) ; +[bestScore(i), best(i)] = max(scores) ; %Mi label final es "Best" (creooo) y lo almaceno + +% figure(1) ; clf ; imagesc(im) ; axis image ; +% title(sprintf('%s (%d), score %.3f',... +% net.classes.description{best}, best, bestScore)) ; +end + +res=best; + + +save('results.mat','res'); diff --git a/lab8_cnn/trainm.png b/lab8_cnn/trainm.png new file mode 100644 index 0000000..7e6cefc Binary files /dev/null and b/lab8_cnn/trainm.png differ diff --git a/pyramid.tif b/pyramid.tif new file mode 100644 index 0000000..def1c3e Binary files /dev/null and b/pyramid.tif differ diff --git a/result.tif b/result.tif new file mode 100644 index 0000000..2822ccb Binary files /dev/null and b/result.tif differ