Commit 58019eea authored by Kelly Chang's avatar Kelly Chang

kelly

parent d2294847
File deleted
......@@ -2,12 +2,25 @@
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 10,
"id": "dbef8759",
"metadata": {
"id": "dbef8759"
},
"outputs": [],
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'pywt'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/var/folders/z2/plvrsqjs023g1cmx7k19mhzr0000gn/T/ipykernel_21377/741789573.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mprediction_MSE_Scout\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfile_extractor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimage_extractor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim_distribution\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mitertools\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mproduct\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Documents/Elphel/image-compression/prediction_MSE_Scout.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mscipy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgaussian_kde\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mentropy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpywt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m#import cv2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pywt'"
]
}
],
"source": [
"import numpy as np\n",
"from prediction_MSE_Scout import file_extractor, image_extractor, im_distribution\n",
......@@ -21,13 +34,13 @@
"from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde\n",
"import seaborn as sns\n",
"import pywt\n",
"#import pywt\n",
"from collections import Counter"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": null,
"id": "9ed20f84",
"metadata": {
"id": "9ed20f84"
......@@ -100,7 +113,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"id": "ba2881d9",
"metadata": {},
"outputs": [],
......@@ -112,10 +125,22 @@
},
{
"cell_type": "code",
"execution_count": 144,
"execution_count": 2,
"id": "11e95c34",
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "NameError",
"evalue": "name 'plot_hist' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/var/folders/z2/plvrsqjs023g1cmx7k19mhzr0000gn/T/ipykernel_21377/1723356297.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpredict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdiff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplot_hist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'plot_hist' is not defined"
]
}
],
"source": [
"predict, diff, im, err, A = plot_hist(images, 2)"
]
......@@ -552,7 +577,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.11"
"version": "3.9.1"
}
},
"nbformat": 4,
......
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 2,
"id": "dbef8759",
"metadata": {},
"outputs": [],
......@@ -18,14 +18,14 @@
"from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde, entropy\n",
"import seaborn as sns\n",
"import pywt\n",
"#import pywt\n",
"import math\n",
"#import cv2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 3,
"id": "b7a550e0",
"metadata": {},
"outputs": [],
......@@ -80,7 +80,7 @@
},
{
"cell_type": "code",
"execution_count": 32,
"execution_count": 4,
"id": "9ed20f84",
"metadata": {},
"outputs": [],
......@@ -133,7 +133,7 @@
},
{
"cell_type": "code",
"execution_count": 34,
"execution_count": 6,
"id": "8e3ef654",
"metadata": {},
"outputs": [],
......@@ -168,7 +168,7 @@
},
{
"cell_type": "code",
"execution_count": 35,
"execution_count": 7,
"id": "fa65dcd6",
"metadata": {},
"outputs": [
......@@ -177,9 +177,9 @@
"output_type": "stream",
"text": [
"Average Error: 19.44221679267325\n",
"Standard Deviaiton of Mean Errors: 0.17734010606906342\n",
"Standard Deviaiton of Mean Errors: 0.1773401060690634\n",
"Average Difference: 51.95430150900486\n",
"Average Time per Image for First: 0.050624340772628784\n"
"Average Time per Image for First: 0.054582178592681885\n"
]
}
],
......@@ -192,7 +192,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 8,
"id": "4c05b947",
"metadata": {},
"outputs": [],
......@@ -202,13 +202,13 @@
},
{
"cell_type": "code",
"execution_count": 28,
"execution_count": 9,
"id": "dda442ae",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -229,31 +229,22 @@
},
{
"cell_type": "code",
"execution_count": 48,
"execution_count": 10,
"id": "58da6063",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
" [ 0. , 22327. , 22323. , ..., 22406.5, 22446. , 0. ],\n",
" [ 0. , 22350.5, 22335.5, ..., 22429. , 22390. , 0. ],\n",
" ...,\n",
" [ 0. , 22099. , 22125. , ..., 22823.5, 22817. , 0. ],\n",
" [ 0. , 22140. , 22172.5, ..., 22774. , 22771. , 0. ],\n",
" [ 0. , 0. , 0. , ..., 0. , 0. , 0. ]])"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"prediction = new_pred.reshape((510,638))\n",
"prediction = np.pad(prediction, pad_width=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a74c686c",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......@@ -272,7 +263,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.11"
"version": "3.9.1"
}
},
"nbformat": 4,
......
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 447,
"id": "8868bc30",
"metadata": {},
"outputs": [],
......@@ -24,7 +24,7 @@
},
{
"cell_type": "code",
"execution_count": 397,
"execution_count": 448,
"id": "76317b02",
"metadata": {},
"outputs": [],
......@@ -79,7 +79,7 @@
},
{
"cell_type": "code",
"execution_count": 398,
"execution_count": 449,
"id": "be1ff8a1",
"metadata": {},
"outputs": [],
......@@ -125,7 +125,7 @@
},
{
"cell_type": "code",
"execution_count": 399,
"execution_count": 440,
"id": "8483903e",
"metadata": {},
"outputs": [],
......@@ -171,62 +171,6 @@
" return nodes[0][0]"
]
},
{
"cell_type": "code",
"execution_count": 400,
"id": "64a3a193",
"metadata": {},
"outputs": [],
"source": [
"def reconstruct(error, A):\n",
" \"\"\"\n",
" Function that reconstructs the original image\n",
" from the error matrix and using the predictive\n",
" algorithm developed in the encoding.\n",
" \n",
" Parameters:\n",
" error (array): matrix of errors computed in encoding. Same \n",
" shape as the original image (512, 640) in this case\n",
" A (array): Matrix used for the system of equations to create predictions\n",
" Returns: \n",
" image (array): The reconstructed image\n",
" \"\"\"\n",
" new_e = error.copy()\n",
" rows, columns = new_e.shape\n",
"\n",
" for r in range(1, rows-1):\n",
" for c in range(1, columns-1):\n",
" z0, z1, z2, z3 = new_e[r-1][c-1], new_e[r-1][c], new_e[r-1][c+1], new_e[r][c-1]\n",
" y = np.vstack((-z0+z2-z3, z0+z1+z2, -z0-z1-z2-z3))\n",
"\n",
" '''if r == 345 and c == 421:\n",
" print(new_e[r][c])\n",
" print(np.linalg.solve(A,y)[-1])\n",
" print(new_e[r][c] + np.linalg.solve(A,y)[-1])\n",
" print(np.ceil(new_e[r][c]) + np.floor(np.linalg.solve(A,y)[-1]))\n",
" \n",
" y0 = np.ravel(-z0+z2-z3)\n",
" y1 = np.ravel(z0+z1+z2)\n",
" y2 = np.ravel(-z0-z1-z2-z3)\n",
" y = np.vstack((y0,y1,y2))\n",
" # use numpy solver to solve the system of equations all at once\n",
" predict = np.floor(np.linalg.solve(A,y)[-1])\n",
" # flatten the neighbor pixlels and stack them together\n",
" z0 = np.ravel(z0)\n",
" z1 = np.ravel(z1)\n",
" z2 = np.ravel(z2)\n",
" z3 = np.ravel(z3)\n",
" neighbor = np.vstack((z0,z1,z2,z3)).T'''\n",
" \n",
" #Real solution that works, DO NOT DELETE\n",
" print(new_e[r][c]+ np.floor(np.linalg.solve(A,y)[-1]))\n",
" new_e[r][c] = new_e[r][c] + np.floor(np.linalg.solve(A,y)[-1])\n",
" print(new_e[r][c])\n",
" #new_e[r][c] = np.ceil(new_e[r][c]) + np.floor(np.linalg.solve(A,y)[-1])\n",
" \n",
" return new_e"
]
},
{
"cell_type": "markdown",
"id": "c7104fbf",
......@@ -614,23 +558,23 @@
},
{
"cell_type": "code",
"execution_count": 427,
"execution_count": 430,
"id": "15eecad3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.44225341796875"
"0.4421759033203125"
]
},
"execution_count": 427,
"execution_count": 430,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def huffman(image):\n",
"def huffman6(image):\n",
" origin, predict, diff, error, A = plot_hist(image)\n",
" image = Image.open(image)\n",
" image = np.array(image)[1:,:] #Convert to an array, leaving out the first row because the first row is just housekeeping data\n",
......@@ -648,7 +592,7 @@
" encode1 = huffman_code_tree(node)\n",
" \n",
" \n",
" mask = diff <= 10\n",
" mask = diff <= 5\n",
" string = [str(i) for i in error[mask].astype(int)]\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
......@@ -656,9 +600,9 @@
" encode2 = huffman_code_tree(node)\n",
"\n",
" \n",
" mask = diff > 10\n",
" mask = diff > 5\n",
" new_error = error[mask]\n",
" mask2 = diff[mask] <= 25\n",
" mask2 = diff[mask] <= 15\n",
" string = [str(i) for i in new_error[mask2].astype(int)]\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
......@@ -666,9 +610,9 @@
" encode3 = huffman_code_tree(node)\n",
" \n",
"\n",
" mask = diff > 25\n",
" mask = diff > 15\n",
" new_error = error[mask]\n",
" mask2 = diff[mask] <= 45\n",
" mask2 = diff[mask] <= 30\n",
" string = [str(i) for i in new_error[mask2].astype(int)]\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
......@@ -676,12 +620,22 @@
" encode4 = huffman_code_tree(node)\n",
" \n",
" \n",
" mask = diff > 45\n",
" string = [str(i) for i in error[mask].astype(int)]\n",
" mask = diff > 30\n",
" new_error = error[mask]\n",
" mask2 = diff[mask] <= 50\n",
" string = [str(i) for i in new_error[mask2].astype(int)]\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
" node = make_tree(freq)\n",
" encode5 = huffman_code_tree(node)\n",
" \n",
" \n",
" mask = diff > 50\n",
" string = [str(i) for i in error[mask].astype(int)]\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
" node = make_tree(freq)\n",
" encode6 = huffman_code_tree(node)\n",
"\n",
" \n",
" \n",
......@@ -697,9 +651,9 @@
" new_error = np.ravel(new_error)\n",
" \n",
" # return the huffman dictionary\n",
" return encode1, encode2, encode3, encode4, encode5, np.ravel(image), error, diff, boundary\n",
" return encode1, encode2, encode3, encode4, encode5, encode6, np.ravel(image), error, diff, boundary\n",
"\n",
"def compress_rate(image, error, diff, bound, encode1, encode2, encode3, encode4, encode5):\n",
"def compress_rate6(image, error, diff, bound, encode1, encode2, encode3, encode4, encode5, encode6):\n",
" #original = original.reshape(-1)\n",
" #error = error.reshape(-1)\n",
" o_len = 0\n",
......@@ -714,28 +668,31 @@
" \n",
" for i in range(0, len(original)):\n",
" o_len += len(bin(original[i])[2:])\n",
" if diff[i] <= 10:\n",
" if diff[i] <= 5:\n",
" c_len += len(encode2[str(int(error[i]))])\n",
"\n",
" if diff[i] <= 25 and diff[i] > 10:\n",
" if diff[i] <= 15 and diff[i] > 5:\n",
" c_len += len(encode3[str(int(error[i]))])\n",
" \n",
" if diff[i] <= 45 and diff[i] > 25:\n",
" if diff[i] <= 30 and diff[i] > 15:\n",
" c_len += len(encode4[str(int(error[i]))])\n",
" \n",
" if diff[i] > 45:\n",
" if diff[i] <= 50 and diff[i] > 30:\n",
" c_len += len(encode5[str(int(error[i]))])\n",
" \n",
" if diff[i] > 50:\n",
" c_len += len(encode6[str(int(error[i]))])\n",
" \n",
" return c_len/o_len\n",
"scenes = file_extractor()\n",
"images = image_extractor(scenes)\n",
"encode1, encode2, encode3, encode4, encode5, image, error, diff, boundary = huffman(images[0])\n",
"compress_rate(image, error, diff, boundary, encode1, encode2, encode3, encode4, encode5)\n"
"encode1, encode2, encode3, encode4, encode5, encode6, image, error, diff, boundary = huffman(images[0])\n",
"compress_rate(image, error, diff, boundary, encode1, encode2, encode3, encode4, encode5, encode6)\n"
]
},
{
"cell_type": "code",
"execution_count": 428,
"execution_count": 431,
"id": "f8a8c717",
"metadata": {},
"outputs": [
......@@ -743,7 +700,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Compression rate of huffman with different bins: 0.4488415273030599\n"
"Compression rate of huffman with different bins: 0.448723882039388\n"
]
}
],
......@@ -754,8 +711,8 @@
"rate = []\n",
"\n",
"for i in range(len(num_images)):\n",
" encode1, encode2, encode3, encode4, encode5, image, error, diff, bound = huffman(num_images[i])\n",
" r = compress_rate(image, error, diff, bound, encode1, encode2, encode3, encode4, encode5)\n",
" encode1, encode2, encode3, encode4, encode5, encode6, image, error, diff, bound = huffman6(num_images[i])\n",
" r = compress_rate6(image, error, diff, bound, encode1, encode2, encode3, encode4, encode5, encode6)\n",
" rate.append(r)\n",
" \n",
" \n",
......@@ -774,143 +731,338 @@
},
{
"cell_type": "code",
"execution_count": 418,
"id": "904ba7b1",
"execution_count": 461,
"id": "d3b29278",
"metadata": {},
"outputs": [],
"source": [
"def enc_experiment(image, plot=True):\n",
" \n",
" origin, predict, diff, error, A = plot_hist(image)\n",
" image = Image.open(image)\n",
" image = np.array(image)[1:,:] #Convert to an array, leaving out the first row because the first row is just housekeeping data\n",
" image = image.astype(int)\n",
" \n",
" new_error = np.copy(image)\n",
" new_error[1:-1,1:-1] = np.reshape(error,(510, 638))\n",
" keep = new_error[0,0]\n",
" new_error[0,:] = new_error[0,:] - keep\n",
" new_error[-1,:] = new_error[-1,:] - keep\n",
" new_error[1:-1,0] = new_error[1:-1,0] - keep\n",
" new_error[1:-1,-1] = new_error[1:-1,-1] - keep\n",
" new_error[0,0] = keep\n",
" new_error = np.ravel(new_error)\n",
" \n",
" \n",
" '''origin, predict, diff, error, A = plot_hist(images)\n",
" image = Image.open(images) #Open the image and read it as an Image object\n",
" image = np.array(image)[1:,:] #Convert to an array, leaving out the first row because the first row is just housekeeping data\n",
" image = image.astype(int)\n",
" new_error = np.copy(image)\n",
" new_error[1:-1,1:-1] = np.reshape(error[1:-1,1:-1],(510, 638))\n",
" #new_error[1:-1, 1:-1] = error[1:-1, 1:-1]\n",
" keep = new_error[0,0]\n",
" new_error[0,:] = new_error[0,:] - keep\n",
" new_error[-1,:] = new_error[-1,:] - keep\n",
" new_error[1:-1,0] = new_error[1:-1,0] - keep\n",
" new_error[1:-1,-1] = new_error[1:-1,-1] - keep\n",
" new_error[0,0] = keep\n",
" new_error = np.ravel(new_error)\n",
" if plot:\n",
" plt.hist(new_error[1:],bins=100)\n",
" plt.show()'''\n",
" \n",
" #ab_error = np.abs(new_error)\n",
" #string = [str(i) for i in ab_error]\n",
" string = [str(i) for i in new_error]\n",
" #string = [str(i) for i in np.arange(0,5)] + [str(i) for i in np.arange(0,5)] + [str(i) for i in np.arange(0,2)]*2\n",
" freq = dict(Counter(string))\n",
" freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)\n",
" \n",
" node = make_tree(freq)\n",
" encoding_dict = huffman_code_tree(node)\n",
" #encoded = [\"1\"+encoding[str(-i)] if i < 0 else \"0\"+encoding[str(i)] for i in error]\n",
" #print(time.time()-start)\n",
" encoded = new_error.reshape((512,640)).copy().astype(str).astype(object)\n",
"\n",
" for i in range(encoded.shape[0]):\n",
" for j in range(encoded.shape[1]):\n",
" if i == 0 and j == 0:\n",
" encoded[i][j] = encoding_dict[encoded[i][j]]\n",
" else:\n",
" #print(encoding_dict[encoded[i][j]])\n",
" encoded[i][j] = encoding_dict[encoded[i][j]]\n",
" #print(encoded[i][j])\n",
" \n",
" return encoding_dict, encoded, new_error.reshape((512,640)), image\n",
" #print(encoding)"
]
},
{
"cell_type": "code",
"execution_count": 496,
"id": "7b584062",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"ename": "IndentationError",
"evalue": "expected an indented block (591304675.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"/var/folders/z2/plvrsqjs023g1cmx7k19mhzr0000gn/T/ipykernel_20810/591304675.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m def encoder():\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
]
}
],
"source": [
"def encoder(list_dic):\n",
" encoded = new_error.reshape((512,640)).copy().astype(str).astype(object)\n",
" for i in range(encoded.shape[0]):\n",
" for j in range(encoded.shape[1]):\n",
" if i == 0 and j == 0:\n",
" encoded[i][j] = encoding_dict[encoded[i][j]]\n",
" else:\n",
" #print(encoding_dict[encoded[i][j]])\n",
" encoded[i][j] = encoding_dict[encoded[i][j]]\n",
" #print(encoded[i][j])\n",
" \n",
" return encoding_dict, encoded, new_error.reshape((512,640)), image"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAOr0lEQVR4nO3dX4ycV33G8e+Dw5+qf0hCtm5kR91IWKrCRUNkhVT0gpKSOElVhwpQUFUsasm9CBKVKhWnvUhLiGQqtSlUBSklFga1BIsWxSJRqRtAqBeQbJo0xEmjbCFRbAVscEiLEKkcfr2YYzQ1M7uz8e7Mrs/3I432fc97Zua8x+Nnzr5z9kyqCklSH14x6wZIkqbH0Jekjhj6ktQRQ1+SOmLoS1JHzpt1A5Zy0UUX1fz8/KybIUkbykMPPfTdqpobdWxdh/78/DwLCwuzboYkbShJnhl3zMs7ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUkXX9F7nSRjS/996R5U/vu2HKLZF+miN9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR2ZOPSTbErycJIvtP1Lk3w9yWKSzyZ5VSt/ddtfbMfnhx7jllb+ZJJrV/1sJElLWslI//3AE0P7HwbuqKrXA88Du1v5buD5Vn5Hq0eSy4CbgDcAO4CPJdl0ds2XJK3ERKGfZCtwA/CJth/grcDnWpUDwI1te2fbpx2/utXfCdxdVS9W1beAReDKVTgHSdKEJh3p/zXwx8CP2/7rgO9X1am2fxTY0ra3AM8CtOMvtPo/KR9xn59IsifJQpKFEydOTH4mkqRlLRv6SX4LOF5VD02hPVTVnVW1vaq2z83NTeMpJakbk6yn/2bgt5NcD7wG+AXgI8D5Sc5ro/mtwLFW/xhwCXA0yXnAa4HvDZWfNnwfSdIULDvSr6pbqmprVc0z+CD2S1X1u8CXgXe0aruAe9r2obZPO/6lqqpWflOb3XMpsA14YNXORJK0rLP55qwPAHcn+RDwMHBXK78L+HSSReAkgzcKqupIkoPA48Ap4Oaqeuksnl+StEIrCv2q+grwlbb9TUbMvqmqHwHvHHP/24HbV9pISdLq8DtypcbvtlUPXIZBkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR1xwTXpZRq3QJu0njnSl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR1xyqa0DKdm6lziSF+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BG/REWaknFfxvL0vhum3BL1zJG+JHVk2dBP8pokDyT5jyRHkvx5K780ydeTLCb5bJJXtfJXt/3Fdnx+6LFuaeVPJrl2zc5KkjTSJCP9F4G3VtWvApcDO5JcBXwYuKOqXg88D+xu9XcDz7fyO1o9klwG3AS8AdgBfCzJplU8F0nSMpYN/Rr4Qdt9ZbsV8Fbgc638AHBj297Z9mnHr06SVn53Vb1YVd8CFoErV+MkJEmTmeiafpJNSR4BjgOHgf8Cvl9Vp1qVo8CWtr0FeBagHX8BeN1w+Yj7DD/XniQLSRZOnDix4hOSJI03UehX1UtVdTmwlcHo/FfWqkFVdWdVba+q7XNzc2v1NJLUpRXN3qmq7wNfBn4NOD/J6SmfW4FjbfsYcAlAO/5a4HvD5SPuI0magklm78wlOb9t/wzwNuAJBuH/jlZtF3BP2z7U9mnHv1RV1cpvarN7LgW2AQ+s0nlIkiYwyR9nXQwcaDNtXgEcrKovJHkcuDvJh4CHgbta/buATydZBE4ymLFDVR1JchB4HDgF3FxVL63u6UiSlrJs6FfVo8AbR5R/kxGzb6rqR8A7xzzW7cDtK2+mJGk1+Be5ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSN+iYq0TvmlK1oLjvQlqSOO9NWVcaNnqReO9CWpI470pRnztw9NkyN9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSR86bdQOkszG/995ZN0HaUBzpS1JHDH1J6oihL0kdWTb0k1yS5MtJHk9yJMn7W/mFSQ4near9vKCVJ8lHkywmeTTJFUOPtavVfyrJrrU7LUnSKJOM9E8Bf1RVlwFXATcnuQzYC9xfVduA+9s+wHXAtnbbA3wcBm8SwK3Am4ArgVtPv1FIkqZj2dCvqueq6t/b9v8ATwBbgJ3AgVbtAHBj294JfKoGvgacn+Ri4FrgcFWdrKrngcPAjtU8GUnS0lZ0TT/JPPBG4OvA5qp6rh36NrC5bW8Bnh2629FWNq78zOfYk2QhycKJEydW0jxJ0jImDv0kPwf8I/CHVfXfw8eqqoBajQZV1Z1Vtb2qts/Nza3GQ0qSmolCP8krGQT+31fVP7Xi77TLNrSfx1v5MeCSobtvbWXjyiVJUzLJ7J0AdwFPVNVfDR06BJyegbMLuGeo/D1tFs9VwAvtMtAXgWuSXNA+wL2mlUmSpmSSZRjeDPwe8I0kj7SyPwH2AQeT7AaeAd7Vjt0HXA8sAj8E3gtQVSeT3AY82Op9sKpOrsZJSJIms2zoV9W/ARlz+OoR9Qu4ecxj7Qf2r6SBkqTV41/kSlJHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOTLKevqR1ZH7vvSPLn953w5Rboo3Ikb4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdcT19bQjj1pCXtDKO9CWpI4a+JHXE0Jekjhj6ktQRP8iVzhF+Ybom4Uhfkjpi6EtSRwx9SerIsqGfZH+S40keGyq7MMnhJE+1nxe08iT5aJLFJI8muWLoPrta/aeS7Fqb05EkLWWSkf4ngR1nlO0F7q+qbcD9bR/gOmBbu+0BPg6DNwngVuBNwJXAraffKCRJ07Ps7J2q+mqS+TOKdwJvadsHgK8AH2jln6qqAr6W5PwkF7e6h6vqJECSwwzeSD5z9qcgaSnO6tGwl3tNf3NVPde2vw1sbttbgGeH6h1tZePKJUlTdNYf5LZRfa1CWwBIsifJQpKFEydOrNbDSpJ4+aH/nXbZhvbzeCs/BlwyVG9rKxtX/lOq6s6q2l5V2+fm5l5m8yRJo7zc0D8EnJ6Bswu4Z6j8PW0Wz1XAC+0y0BeBa5Jc0D7AvaaVSZKmaNkPcpN8hsEHsRclOcpgFs4+4GCS3cAzwLta9fuA64FF4IfAewGq6mSS24AHW70Pnv5QVxrmuvnS2ppk9s67xxy6ekTdAm4e8zj7gf0rap0kaVX5F7mS1BFDX5I6YuhLUkcMfUnqiF+ioplwlo40G470Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjrj2jtSppdY/enrfDVNsiabJkb4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiFM2tab8WsSNady/m1M5Nz5H+pLUEUNfkjpi6EtSRwx9SeqIoS9JHXH2jqSJOatn43OkL0kdcaSvVeF8fGljMPS1Ioa7tLF5eUeSOmLoS1JHvLwj6aw5q2fjcKQvSR0x9CWpI17e0UjO0tFq8LLP+mPod8IQlwQzCP0kO4CPAJuAT1TVvmm3QdJs+RvA7Ew19JNsAv4WeBtwFHgwyaGqenya7ThXOZrXRrfSNwPfPFZu2iP9K4HFqvomQJK7gZ1A16FvWEtL8//I6pl26G8Bnh3aPwq8abhCkj3Anrb7gyRPTqltwy4CvjuD513v7JfR7JfRZtYv+fAsnnVi0+iXXx53YN19kFtVdwJ3zrINSRaqavss27Ae2S+j2S+j2S+jzbpfpj1P/xhwydD+1lYmSZqCaYf+g8C2JJcmeRVwE3Boym2QpG5N9fJOVZ1K8j7giwymbO6vqiPTbMOEZnp5aR2zX0azX0azX0ab7eXrqprl80uSpsi1dySpI4a+JHWk69BP8s4kR5L8OMn2M47dkmQxyZNJrh0q39HKFpPsnX6rpyvJnyU5luSRdrt+6NjIPupFb6+FpSR5Osk32mtkoZVdmORwkqfazwtm3c5pSLI/yfEkjw2VjeyLDHy0vYYeTXLFWrev69AHHgN+B/jqcGGSyxjMLHoDsAP4WJJNQ8tIXAdcBry71T3X3VFVl7fbfTC+j2bZyGnq+LWwlN9or5HTA6i9wP1VtQ24v+334JMM/k8MG9cX1wHb2m0P8PG1blzXoV9VT1TVqL/43QncXVUvVtW3gEUGS0j8ZBmJqvpf4PQyEj0a10e98LWwvJ3AgbZ9ALhxdk2Znqr6KnDyjOJxfbET+FQNfA04P8nFa9m+rkN/CaOWi9iyRPm57n3tV8/9Q7+i99oXp/V+/mcq4F+SPNSWUgHYXFXPte1vA5tn07R1YVxfTP11tO6WYVhtSf4V+KURh/60qu6ZdnvWo6X6iMGvm7cx+E99G/CXwO9Pr3XaIH69qo4l+UXgcJL/HD5YVZXE+eHMvi/O+dCvqt98GXdbarmIc24ZiUn7KMnfAV9ou70vqdH7+f8/VXWs/Tye5PMMLn99J8nFVfVcu2RxfKaNnK1xfTH115GXd0Y7BNyU5NVJLmXwIcsDdLiMxBnXF9/O4MNvGN9HvejutTBOkp9N8vOnt4FrGLxODgG7WrVdQM+/WY/ri0PAe9osnquAF4YuA62Jc36kv5Qkbwf+BpgD7k3ySFVdW1VHkhxksM7/KeDmqnqp3WcjLCOxmv4iyeUMLu88DfwBwFJ91IMNtKTINGwGPp8EBpnyD1X1z0keBA4m2Q08A7xrhm2cmiSfAd4CXJTkKHArsI/RfXEfcD2DiRA/BN675u1zGQZJ6oeXdySpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6sj/AWcE/seQ9eQkAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"cell_type": "code",
"execution_count": 471,
"id": "1ec5c5e3",
"metadata": {},
"outputs": [],
"source": [
"encoding_dict, encoded_matrix, error, orig_image = enc_experiment(images[0], plot=False)"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"cell_type": "code",
"execution_count": 472,
"id": "0db56037",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[['111001110100111000' '110001' '11111000' ... '001010' '1110000'\n",
" '0010010']\n",
" ['101000' '100101' '110001' ... '0010111' '110111' '00111111']\n",
" ['110011' '010011' '010000' ... '110110' '110001' '1110000']\n",
" ...\n",
" ['1111111101011101' '010010' '101110' ... '0010111' '110111' '01111110']\n",
" ['1111111101011110' '100110' '110110' ... '11111000' '1110111' '000101']\n",
" ['011111110000000' '111111110110010' '01011010111001' ...\n",
" '01011010001001' '11111001001' '0110100110']]\n"
]
}
],
"source": [
"print(encoding)\n",
"A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]])"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"cell_type": "code",
"execution_count": 478,
"id": "f145c221",
"metadata": {},
"outputs": [],
"source": [
"def decoder(A, encoded_matrix, encoding_dict):\n",
" \"\"\"\n",
" Function that accecpts the prediction matrix A for the linear system,\n",
" the encoded matrix of error values, and the encoding dicitonary.\n",
" \"\"\"\n",
" the_keys = list(encode_dict.keys())\n",
" the_values = list(encode_dict.values())\n",
" error_matrix = encoded_matrix.copy()\n",
" \n",
" for i in range(error_matrix.shape[0]):\n",
" for j in range(error_matrix.shape[1]):\n",
" if i == 0 and j == 0:\n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])])\n",
" elif i == 0 or i == error_matrix.shape[0]-1 or j == 0 or j == error_matrix.shape[1]-1:\n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])]) + error_matrix[0][0]\n",
" else:\n",
" if j == 1 and i == 1:\n",
" z0, z1, z2, z3 = error_matrix[i-1][j-1], error_matrix[i-1][j], \\\n",
" error_matrix[i-1][j+1], error_matrix[i][j-1]\n",
"\n",
" y = np.vstack((-z0+z2-z3, z0+z1+z2, -z0-z1-z2-z3))\n",
" #Real solution that works, DO NOT DELETE\n",
" #new_e[r][c] = int(np.ceil(new_e[r][c] + np.linalg.solve(A,y)[-1]))\n",
"\n",
" print(int(the_keys[the_values.index(error_matrix[i,j])]))\n",
" print(np.linalg.solve(A,y)[-1])\n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])]) + \\\n",
" np.floor(np.linalg.solve(A,y)[-1][0])\n",
" #error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])])\n",
" break\n",
" \n",
" return error_matrix"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"cell_type": "code",
"execution_count": 481,
"id": "e3b2f3a7",
"metadata": {},
"outputs": [],
"source": [
"def decoder(A, encoded_matrix, encoding_dict):\n",
" \"\"\"\n",
" Function that accecpts the prediction matrix A for the linear system,\n",
" the encoded matrix of error values, and the encoding dicitonary.\n",
" \"\"\"\n",
" the_keys = list(encode_dict.keys())\n",
" the_values = list(encode_dict.values())\n",
" error_matrix = encoded_matrix.copy()\n",
" \n",
" for i in range(error_matrix.shape[0]):\n",
" for j in range(error_matrix.shape[1]):\n",
" if i == 0 and j == 0:\n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])])\n",
" \n",
" elif i == 0 or i == error_matrix.shape[0]-1 or j == 0 or j == error_matrix.shape[1]-1:\n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])]) + error_matrix[0][0]\n",
" else:\n",
" \"\"\"z0, z1, z2, z3 = error_matrix[i-1][j-1], error_matrix[i-1][j], \\\n",
" error_matrix[i-1][j+1], error_matrix[i][j-1]\n",
" y = np.vstack((-z0+z2-z3, z0+z1+z2, -z0-z1-z2-z3))\"\"\"\n",
" \n",
" error_matrix[i][j] = int(the_keys[the_values.index(error_matrix[i,j])])\n",
" \n",
" return error_matrix.astype(int)"
]
},
"metadata": {
"needs_background": "light"
{
"cell_type": "code",
"execution_count": 487,
"id": "1358d386",
"metadata": {},
"outputs": [],
"source": [
"image_error = decoder(A, encoded_matrix, encoding_dict)"
]
},
"output_type": "display_data"
}
],
{
"cell_type": "code",
"execution_count": 488,
"id": "d9c7fb94",
"metadata": {},
"outputs": [],
"source": [
"plt.hist(error,bins=50)\n",
"plt.show()\n",
"mask = diff <= 20\n",
"plt.hist(error[mask],bins=50)\n",
"plt.show()\n",
"\n",
"mask = diff > 20\n",
"new_error = error[mask]\n",
"mask2 = diff[mask] <= 35\n",
"plt.hist(new_error[mask2],bins=50)\n",
"plt.show()\n",
"\n",
"mask = diff > 35\n",
"new_error = error[mask]\n",
"mask2 = diff[mask] <= 50\n",
"plt.hist(new_error[mask2],bins=50)\n",
"plt.show()\n",
"def reconstruct(error, A):\n",
" \"\"\"\n",
" Function that reconstructs the original image\n",
" from the error matrix and using the predictive\n",
" algorithm developed in the encoding.\n",
" \n",
" Parameters:\n",
" error (array): matrix of errors computed in encoding. Same \n",
" shape as the original image (512, 640) in this case\n",
" A (array): Matrix used for the system of equations to create predictions\n",
" Returns: cd cdcd\n",
" image (array): The reconstructed image\n",
" \"\"\"\n",
" new_e = error.copy()\n",
" rows, columns = new_e.shape\n",
"\n",
"mask = diff > 50\n",
"#new_error = error[mask]\n",
"#mask2 = diff[mask] <= 400\n",
"plt.hist(error[mask],bins=50)\n",
"plt.show()"
" for r in range(1, rows-1):\n",
" for c in range(1, columns-1):\n",
" z0, z1, z2, z3 = new_e[r-1][c-1], new_e[r-1][c], new_e[r-1][c+1], new_e[r][c-1]\n",
" y = np.vstack((-z0+z2-z3, z0+z1+z2, -z0-z1-z2-z3))\n",
" \n",
" if r == 1 and c == 1:\n",
" print(np.linalg.solve(A,y)[-1])\n",
" \n",
" #Real solution that works, DO NOT DELETE\n",
" #new_e[r][c] = int(np.ceil(new_e[r][c] + np.linalg.solve(A,y)[-1]))\n",
" \n",
" new_e[r][c] = np.round(new_e[r][c] + np.linalg.solve(A,y)[-1], 1)\n",
" \n",
" return new_e.astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 236,
"id": "2f5ef010",
"execution_count": 489,
"id": "76317e71",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(512, 640)\n"
"[22543.5]\n"
]
}
],
"source": [
"image = Image.open(images[0])\n",
"image = np.array(image)[1:,:] #Convert to an array, leaving out the first row because the first row is just housekeeping data\n",
"image = image.astype(int)\n",
"boundary = np.hstack((image[0,:],image[-1,:],image[1:-1,0],image[1:-1,-1]))\n",
"boundary = boundary - image[0,0]\n",
"boundary[0] = image[0,0]\n",
"print(image.shape)"
"new_image = reconstruct(image_error, A)"
]
},
{
"cell_type": "code",
"execution_count": 228,
"id": "4860903b",
"execution_count": 494,
"id": "ecdd3a13",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[22554 -2 -35 ... -16 40 19]\n"
"[[22554 22552 22519 ... 22537 22529 22523]\n",
" [22561 22552 22543 ... 22544 22533 22513]\n",
" [22559 22565 22548 ... 22526 22508 22529]\n",
" ...\n",
" [22674 22661 22654 ... 22670 22617 22594]\n",
" [22656 22652 22644 ... 22640 22625 22573]\n",
" [22659 22653 22642 ... 22649 22615 22613]]\n",
"[[22554 22552 22519 ... 22537 22529 22523]\n",
" [22561 22552 22543 ... 22544 22533 22513]\n",
" [22559 22565 22548 ... 22526 22508 22529]\n",
" ...\n",
" [22674 22661 22654 ... 22670 22617 22594]\n",
" [22656 22652 22644 ... 22640 22625 22573]\n",
" [22659 22653 22642 ... 22649 22615 22613]]\n"
]
}
],
"source": [
"print(new_image)\n",
"print(orig_image)"
]
},
{
"cell_type": "code",
"execution_count": 495,
"id": "fe17a80c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 495,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(boundary)"
"np.all(new_image - orig_image == 0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f145c221",
"id": "fbe1a2f7",
"metadata": {},
"outputs": [],
"source": []
......
......@@ -2,12 +2,24 @@
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 19,
"id": "dbef8759",
"metadata": {
"id": "dbef8759"
},
"outputs": [],
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'prediction_MSE_kelly'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/var/folders/z2/plvrsqjs023g1cmx7k19mhzr0000gn/T/ipykernel_21377/700581042.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mprediction_MSE_kelly\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfile_extractor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimage_extractor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim_distribution\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mitertools\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mproduct\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'prediction_MSE_kelly'"
]
}
],
"source": [
"import numpy as np\n",
"from prediction_MSE_Scout import file_extractor, image_extractor, im_distribution\n",
......@@ -21,13 +33,13 @@
"from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde\n",
"import seaborn as sns\n",
"import pywt\n",
"#import pywt\n",
"from collections import Counter"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": null,
"id": "9ed20f84",
"metadata": {
"id": "9ed20f84"
......@@ -100,7 +112,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"id": "ba2881d9",
"metadata": {},
"outputs": [],
......@@ -112,10 +124,22 @@
},
{
"cell_type": "code",
"execution_count": 144,
"execution_count": 2,
"id": "11e95c34",
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "NameError",
"evalue": "name 'plot_hist' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/var/folders/z2/plvrsqjs023g1cmx7k19mhzr0000gn/T/ipykernel_21377/1723356297.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpredict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdiff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplot_hist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'plot_hist' is not defined"
]
}
],
"source": [
"predict, diff, im, err, A = plot_hist(images, 2)"
]
......@@ -552,7 +576,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.11"
"version": "3.9.1"
}
},
"nbformat": 4,
......
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 2,
"id": "dbef8759",
"metadata": {},
"outputs": [],
......@@ -18,14 +18,14 @@
"from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde, entropy\n",
"import seaborn as sns\n",
"import pywt\n",
"#import pywt\n",
"import math\n",
"#import cv2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 3,
"id": "b7a550e0",
"metadata": {},
"outputs": [],
......@@ -80,7 +80,7 @@
},
{
"cell_type": "code",
"execution_count": 32,
"execution_count": 4,
"id": "9ed20f84",
"metadata": {},
"outputs": [],
......@@ -133,7 +133,7 @@
},
{
"cell_type": "code",
"execution_count": 34,
"execution_count": 6,
"id": "8e3ef654",
"metadata": {},
"outputs": [],
......@@ -168,7 +168,7 @@
},
{
"cell_type": "code",
"execution_count": 35,
"execution_count": 7,
"id": "fa65dcd6",
"metadata": {},
"outputs": [
......@@ -177,9 +177,9 @@
"output_type": "stream",
"text": [
"Average Error: 19.44221679267325\n",
"Standard Deviaiton of Mean Errors: 0.17734010606906342\n",
"Standard Deviaiton of Mean Errors: 0.1773401060690634\n",
"Average Difference: 51.95430150900486\n",
"Average Time per Image for First: 0.050624340772628784\n"
"Average Time per Image for First: 0.054582178592681885\n"
]
}
],
......@@ -192,7 +192,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 8,
"id": "4c05b947",
"metadata": {},
"outputs": [],
......@@ -202,13 +202,13 @@
},
{
"cell_type": "code",
"execution_count": 28,
"execution_count": 9,
"id": "dda442ae",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEGCAYAAACtqQjWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAArg0lEQVR4nO3de7xcZX3v8c93di6QkASSbHKF7JCEQADlkgYstlWpCqIET6GGqoWWSvuqHKu255zg7Xg82gMerbUHbEWhRasCUrBRsSgXrSDEBEQgCSE7yQ5JyGXnQkJCbnvP7/yx1g6TcfY1M3vN5ft+veY1a571rGd+s0j45VnPs56liMDMzKwcclkHYGZm9cNJxczMysZJxczMysZJxczMysZJxczMymZI1gFkafz48dHS0pJ1GGZmNeXJJ5/cFhHNpfY1dFJpaWlh6dKlWYdhZlZTJK3rbp8vf5mZWdk4qZiZWdk4qZiZWdk4qZiZWdk4qZiZWdk4qZiZWdk4qZiZWdk4qZiVix8jYdbYNz+alcWiD8HzP0iSyl/9Go4ZnXVEZplxT8XsaETA09+GyMO+HbBrQ9YRmWXKScXsaOzfBflDMHVe8vnV7dnGY5YxJxWzo7F3W/LePDt5d1KxBuekYnY0Xu1KKqcd+dmsQVU0qUi6WNJKSa2SFpbYP1zSXen+xZJa0vJxkh6RtEfSzQX1R0l6uuC1TdLfp/uukdResO/PKvnbzADY2568H+6p7MguFrMqULHZX5KagFuAtwIbgCWSFkXE8oJq1wI7I2KmpAXATcB7gP3AJ4Ez0xcAEfEKcHbBdzwJ3FvQ3l0RcX1lfpFZCV1JZfRkGD7al7+s4VWypzIPaI2INRFxELgTmF9UZz5wR7p9D3CRJEXE3oh4lCS5lCTpVOBE4OflD92sj7rGVEaMhxFjnVSs4VUyqUwB1hd83pCWlawTER3ALmBcH9tfQNIzKbzj7A8kPSPpHkknlTpI0nWSlkpa2t7e3sevMuvG3m0wfAwMGZYklr0eU7HGVssD9QuA7xR8/j7QEhGvA37Caz2gI0TErRExNyLmNjeXfBqmWd/tbYeR45PtEePcU7GGV8mkshEo7C1MTctK1pE0BBgD9Pq3UtLrgSER8WRXWURsj4gD6cevA+cNPHSzPtrbDiPTf5yMGOeBemt4lUwqS4BZkqZLGkbSs1hUVGcRcHW6fQXwcNHlrO5cxZG9FCRNKvh4GbBiQFGb9cer21/rqYx0T8WsYrO/IqJD0vXAA0ATcHtELJP0GWBpRCwCbgO+KakV2EGSeACQ1AaMBoZJuhx4W8HMsT8E3lH0lR+SdBnQkbZ1TaV+m9lhe9vhpPRu+hHjoGMfHNwLw0ZmG5dZRiq6oGRE3A/cX1T2qYLt/cCV3Rzb0kO7p5QouwG4YaCxmvVbvjPtqRRc/oKkzEnFGlQtD9SbZWvfzmQhyVJJxaxBOamYDVTX9OHDs7/SdycVa2BOKmYD1XU3/YiCKcUAe51UrHE5qZgNVFdSOXz5a2zy7p6KNTAnFbOBKr78dczxoCYnFWtoTipmA7W9FYaOfO3yVy6Xrv/lpVqscTmpmA3U1uVw4ulJMukyaiLsKl44wqxxOKmYDUQEbFkGE+YcWT52BuxYnU1MZlXAScVsIPZsgX074MQzjiwfNwN2roPOQ9nEZZYxJxWzgdiyLHkv1VOJTnj5xcGPyawKVHSZFrN60LLwh79R9mdNP+QTQ+Gcr25kJ6/tP09b+LfhcM0Xv8NP8+fQduOlgxmqWebcUzEbgNNy69kax7OT0UeUt8VEAKZrcxZhmWXOScVsAGbrRZ7P/+bDRbczmlfiWFqcVKxBOamY9dNwDnKqNvJ8nFxir2iLCbRoy6DHZVYNnFTM+mle7nmG6xC/yM8pub8tJrqnYg3LScWsn96S+xX7YyhPdJNU1sZEpqqdoXQMcmRm2XNSMeunN+We5vH8HPYzvOT+tflJNCncW7GG5KRi1g8t2sT03BYezp/TbZ2nYyYAc3MrBysss6rhpGLWD2/OPQ3AT/Ov77bO2pjIljieC3IrBikqs+pR0aQi6WJJKyW1SlpYYv9wSXel+xdLaknLx0l6RNIeSTcXHfPTtM2n09eJPbVlVk4X5FawLn8i62NCD7XE4vzpnJ9bkawRZtZAKpZUJDUBtwCXAHOAqyQVj2xeC+yMiJnAl4Cb0vL9wCeBv+mm+fdGxNnpa2svbZmVSTA3t5IlcVqvNZ/Iz2GidsKONYMQl1n1qGRPZR7QGhFrIuIgcCcwv6jOfOCOdPse4CJJioi9EfEoSXLpq5JtDTx8syPN0EuM0yssyc/ute7ifJp42h6tcFRm1aWSSWUKsL7g84a0rGSdiOgAdgHj+tD2P6eXvj5ZkDj61Jak6yQtlbS0vb29P7/HGtzc3AsAfUoqq2My7THGScUaTi0O1L83Is4Cfid9vb8/B0fErRExNyLmNjc3VyRAq0/zcs+zLUazJib1obZ4In86rHvM4yrWUCqZVDYChYsjTU3LStaRNAQYA/T4gO+I2Ji+vwJ8m+Qy24DaMuuPuVrJ0vxsoG9XVRfnT4fdG2Hn2soGZlZFKplUlgCzJE2XNAxYACwqqrMIuDrdvgJ4OKL7f9ZJGiJpfLo9FHgn8NxA2jLrjxPYzbTcVp7Mz+rzMY933XHf9liFojKrPhV7nkpEdEi6HngAaAJuj4hlkj4DLI2IRcBtwDcltQI7SBIPAJLagNHAMEmXA28D1gEPpAmlCXgQ+Fp6SLdtmR2tWUo62SvjN1cm7s7qmAwjm5NxlXP7dZXWrGZV9CFdEXE/cH9R2acKtvcDV3ZzbEs3zZ7XTf1u2zI7WrNySVJpzRfPNemJYNqFr42reDKiNYBaHKg3G3QztZE9cQwv9WlyYoGWN8Ku9fDyusoEZlZlnFTM+mCmNtIak+nrIP1hJ6XzSDY+VfaYzKqRk4pZH8zKbaQ1pvb/wObTIDcENj9b/qDMqpCTilkvRrOXidpJa35y/w8eMhyaT4fNz5Q/MLMq5KRi1ouZ6cyvVdGfQfoCE89yT8UahpOKWS9m5rqSygAuf0GSVPZsgVf83Hqrf04qZr2YqZfYH0PZEANc1mfS65J391asATipmPViljawOiaTH+hflwlnJu8eV7EG4KRi1otk5tcAx1MAjj0ejp/mpGINwUnFrCcH9jBV21jVrzvpS5hwJmz144Wt/jmpmPVkW/IMlQHP/OrSPBu2t0LnoTIEZVa9nFTMepImlaO6/AXJTZD5Dti+ugxBmVUvJxWznrQ/z6FoYl1MOLp2TjztcHtm9cxJxawn7StZGxPpONoFvcfNAgTtK8sSllm1clIx60n780c/ngIwbAScMM09Fat7Tipm3Tm0H3a2DWwhyVKaT3NPxeqek4pZd7a9AJE/+unEXZpnw/ZV0NlRnvbMqpCTill3tiwDYEWcXJ72mk+DzoOws6087ZlVIScVs+5sXQZNw2mLieVpr3l28u5xFatjTipm3dmyHJpPpZOm8rQ3dkbyvsP3qlj9qmhSkXSxpJWSWiUtLLF/uKS70v2LJbWk5eMkPSJpj6SbC+qPkPRDSc9LWibpxoJ910hql/R0+vqzSv42awBblr22GGQ5HHs8jGxO7qw3q1MVSyqSmoBbgEuAOcBVkuYUVbsW2BkRM4EvATel5fuBTwJ/U6LpL0TEacA5wIWSLinYd1dEnJ2+vl7Gn2ON5tUdsGcznFj8R/YojZ0B29eUt02zKlLJnso8oDUi1kTEQeBOYH5RnfnAHen2PcBFkhQReyPiUZLkclhEvBoRj6TbB4GngDLN9zQrkA7SM6HMSWXcTPdUrK5VMqlMAdYXfN6QlpWsExEdwC5gXF8al3Q88C7goYLiP5D0jKR7JJ3UzXHXSVoqaWl7e3uffog1oMNJpYyXvwDGnZL0gA68Ut52zapETQ7USxoCfAf4h4joupbwfaAlIl4H/ITXekBHiIhbI2JuRMxtbh7gk/ys/m1dDseOheOOcs2vYuNmJu87fAnM6lMlk8pGoLC3MDUtK1knTRRjgO19aPtWYFVE/H1XQURsj4gD6cevA+cNLGwzkv/pj5sJUnnb7UoqvgRmdaqSSWUJMEvSdEnDgAXAoqI6i4Cr0+0rgIcjInpqVNJnSZLPh4vKJxV8vAzwE5Fs4Ha2wdjp5W/3hLRND9ZbnTrKpVe7FxEdkq4HHgCagNsjYpmkzwBLI2IRcBvwTUmtwA6SxAOApDZgNDBM0uXA24DdwMeB54GnlPwr8uZ0pteHJF0GdKRtXVOp32Z1ruMg7NoAJ7SUv+1hI2D0VPdUrG5VLKkARMT9wP1FZZ8q2N4PXNnNsS3dNFvyekRE3ADcMKBAzQq9/CIQr/Uqym3cKU4qVrdqcqDerKK61uaqRE8FknEV31VvdcpJxazYzrXJeyXGVCBJKvt2JjdYmtUZJxWzYjvbYMix5Z9O3KVrDTA/r97qkJOKWbEda5NLX+WeTtzF04qtjjmpmBXb2Va58RRIHiusJicVq0tOKmaFIip3j0qXpqFJYvFgvdWhik4pNqs5e9vh0N6y9VRaFv6wZPntQ0czYdtTXPpk6f1tN15alu83G2zuqZgV2pHO/Krk5S+gLSbSos1AjwtImNUcJxWzQofvUang5S9gTUxipA5wIi9X9HvMBpuTilmhnWsBwfEnV/Rr1qbPvT8lt6mi32M22JxUzArtbIPRk2HoMRX9mrX5ZP3TU+SkYvXFScWsUKWnE6c2MZZXYzgz9FLFv8tsMPUpqUi6V9KlkpyErL7tWFvx8RSAIMeamOSkYnWnr0niK8AfAask3ShpdgVjMsvGwVeTR/0OQk8FYHVMdlKxutOnpBIRD0bEe4FzgTbgQUm/kPQnkoZWMkCzQfPyuuS9kjc+FmjNT2aKtnEMB3qvbFYj+nw5S9I4kgdf/RnwK+DLJEnmJxWJzGywVXrJ+yKrYzI5hQfrra70dUzlPuDnwAjgXRFxWUTcFRH/FTiukgGaDZrDNz4OTk9ldUwG8CUwqyt9Xabla+lTHA+TNDwiDkTE3ArEZTb4drbBsFEwYuygfF1bTCQfYkbuJcgPyleaVVxfL399tkTZ4+UMxCxzO9bA2JbKLXlf5ADDWB/NzHRPxepIj0lF0kRJ5wHHSjpH0rnp600kl8J6JOliSSsltUpaWGL/cEl3pfsXS2pJy8dJekTSHkk3Fx1znqRn02P+QUr+DyBprKSfSFqVvp/Q57NgBrB91WvPOhkkrTGFGdo4qN9pVkm99VTeDnwBmAr8HfDF9PVR4GM9HSipCbgFuASYA1wlaU5RtWuBnRExE/gScFNavh/4JPA3JZr+R+ADwKz0dXFavhB4KCJmAQ+ln836puMAvPwijJs1qF+7NibSoi14YUmrFz0mlYi4IyLeDFwTEW8ueF0WEff20vY8oDUi1kTEQeBOYH5RnfnAHen2PcBFkhQReyPiUZLkcpikScDoiHgiIgL4BnB5ibbuKCg3692ONRB5GD+4SaUtJnKsDjKBnYP6vWaV0uNAvaT3RcS/Ai2SPlq8PyL+rofDpwDrCz5vAM7vrk5EdEjaBYwDtvXQ5oaiNqek2xMiomtu5magQg8Yt7rU9RTGQb781ZYuLNmiLWyJwZkgYFZJvV3+Gpm+HweMKvGqSmkvpuT1BEnXSVoqaWl7e/sgR2ZVa9uq5H3Qk0ryb59puc2D+r1mldJjTyUivpq+/68BtL0ROKng89S0rFSdDZKGAGOA7b20ObWbNrdImhQRm9LLZFtLNRARtwK3AsydO9cXsi2xvRWOmwjHjB7Ur90U4zgYTUyXk4rVh77e/Ph5SaMlDZX0kKR2Se/r5bAlwCxJ0yUNAxYAi4rqLAKuTrevAB5OexklpZe3dku6IJ319cfAv5do6+qCcrPebVs16OMpAJ00sT5OZJq2DPp3m1VCX+9TeVtE7AbeSbL210zgv/V0QER0ANcDDwArgLsjYpmkz0i6LK12GzBOUivJjLLDM7YktZHMOLtG0oaCmWN/CXwdaAVWAz9Ky28E3ippFfD76WezvslgOnGXtsMzwMxqX1/vqO+qdynw3YjYpT7cIJbehX9/UdmnCrb3A1d2c2xLN+VLgTNLlG8HLuo1KLNie7fDvp2Z9FQA1sUELsgtJxkGHJwbL80qpa89lR9Ieh44D3hIUjNF033Natb2rkH6bJJKW0xgpA7Q7OfVWx3o69L3C4HfBuZGxCFgL795z4lZbeqa+TU+u8tfgC+BWV3o6+UvgNNI7lcpPOYbZY7HbPBtXwW5oXD8tEy+/nBSyW1mSedpmcRgVi59SiqSvgnMAJ4GOtPirjvazWrbtlYYewrkmjL5+o0xnkPRRIunFVsd6GtPZS4wp6fpvmY1a/sqGH9qZl+fTCtu9rRiqwt9Hah/DphYyUDMMtHZkTycK6PpxF3WxQSPqVhd6GtPZTywXNIv4bUHakfEZd0fYlYDXl4H+UOZTSfu0hYTmZt7AU8rtlrX16Ty6UoGYZaZbdlOJ+6yLiYwSvsYz262MSbTWMyORp+SSkT8TNI0YFZEPChpBJDNqKZZOXXdo1IFPRWAadrMtnBSsdrV17W/PkDyvJOvpkVTgO9VKCazwbNtFRw7dtCeS9+drtWKPa5ita6vA/UfBC4EdgNExCrgxEoFZTZotrdm3ksB2BDNdESOFi+BbzWur2MqByLiYNd6X+kNkJ5ebDWjZeEPS5YvGf4cj3SezX/vZv9g6WAIG6LZ96pYzetrT+Vnkj4GHCvprcB3ge9XLiyzyhvFqzRrF2tiUtahAMlgve9VsVrX16SyEGgHngX+nGTl4U9UKiizwXCKXgKomqTSFhPSnoovAljt6uvsr7yk7wHfiwg/g9fqwinaBMDqmJxxJIl1MZHR2sdYXsk6FLMB67GnosSnJW0DVgIr06c+fqqn48xqwSm5TXREjhfTmVdZW3t4tWKPq1jt6u3y10dIZn39VkSMjYixwPnAhZI+UvHozCpoujaxPpo51K/FuitnXZrcPK5itay3pPJ+4KqIWNtVEBFrgPeRPB/erGbN0CbWVMmlL4D1cSKdIU8rtprWW1IZGhHbigvTcZWhlQnJrPJEnhZtPnzJqRocYggbY7xvgLSa1ltSOTjAfWZVbTLbOVYHq6qnAslyLdM8pmI1rLek8npJu0u8XgHO6q1xSRdLWimpVdLCEvuHS7or3b9YUkvBvhvS8pWS3p6WzZb0dMFrt6QPp/s+LWljwb539OdEWGM5JZfM/KqW6cRd1sUEpmsz+NFFVqN6HKGMiAEvGimpCbgFeCuwAVgiaVFELC+odi2wMyJmSloA3AS8R9IcYAFwBjAZeFDSqRGxEji7oP2NwH0F7X0pIr4w0JitccxI71FpzU/JOJIjtcVExuhV2Lcz8/XIzAairzc/DsQ8oDUi1kTEQeBOYH5RnfnAHen2PcBFStaCmQ/cGREH0kkCrWl7hS4CVkfEuor9AqtbM/QSu2IE2xiddShH6FpYkh1rsg3EbIAqmVSmAOsLPm9Iy0rWiYgOYBcwro/HLgC+U1R2vaRnJN0u6YRSQUm6TtJSSUvb230fZ6OaoZfS8ZTqeiBW1xL4bF+dbSBmA1TJpFIxkoYBl5GsQdblH4EZJJfHNgFfLHVsRNwaEXMjYm5zc3OlQ7UqNSP3UtXcSV+oa1ox21uzDsVsQCqZVDYCJxV8npqWlayTrnw8Btjeh2MvAZ6KiMNzLyNiS0R0RkQe+Bq/ebnMDEgWkpygl1mdr76kcpChrI8TX3t4mFmNqWRSWQLMkjQ97VksABYV1VkEXJ1uXwE8HBGRli9IZ4dNB2YBvyw47iqKLn1JKpzG827gubL9EqsrXQtJrq6ymV9dVsfk1x5zbFZjKrY+RUR0SLoeeIDk0cO3R8QySZ8BlkbEIuA24JuSWoEdJImHtN7dwHKgA/hgRHQCSBpJMqPsz4u+8vOSziZZ4rWtxH4zoPoWkiy2OiZz0faHIJ+HXE1eobYGVtFFjyLifpJl8gvLPlWwvR+4sptjPwd8rkT5XpLB/OLy9x9tvNYYZuRe4lA0HV5rq9qsiUnQsR92rYcTpmUdjlm/+J9B1nBm6CVejBPpqJKFJIsdHuvxJTCrQU4q1nBmqDpnfnU5HNu2F7INxGwAnFSsoTTRSYs2V3VS2cEoOPYEJxWrSU4q1lBO0laGqbOqkwoIxp/qy19Wk5xUrKF0rflVjfeoHGH8LPdUrCY5qVhDmVHl96gcNn427N0Kr+7IOhKzfnFSsYYyQ5tojzHs5risQ+nZiXOS960rso3DrJ+cVKyhVOuaX7/hxNOT963Le65nVmWcVKyBBDO1sfrHUwBGT4ZjxjipWM1xUrGGMZZXOF57a6OnIiWXwHz5y2qMk4o1jNcG6WsgqUByCWzrcj9a2GqKk4o1jFm55OkJtZNU5sD+XbD7pawjMeszJxVrGLP1Iq/EsWyI8VmH0jeeAWY1yEnFGsZpufW8EFOptkcId+vwDLBl2cZh1g9OKtYggtlaz8r8Sb1XrRYjxsKoybDZz5uz2uGkYg1hAjs5Xnt5PmooqQBMeh1sfjbrKMz6zEnFGsJpufUArMyfnHEk/TTxrGQNsEP7so7ErE+cVKwhzNaLALXXU5n4OohO2OKbIK02OKlYQ5idW8/mOIFd1b7mV7GJZyXvm5/JNg6zPnJSsYZwWq0N0nc5oQWGj3FSsZpR0aQi6WJJKyW1SlpYYv9wSXel+xdLainYd0NavlLS2wvK2yQ9K+lpSUsLysdK+omkVen7CZX8bVZDOg4ySxtYEdOyjqT/pKS34sF6qxEVSyqSmoBbgEuAOcBVkuYUVbsW2BkRM4EvATelx84BFgBnABcDX0nb6/LmiDg7IuYWlC0EHoqIWcBD6WczaH+eYerkuXxL1pEMzMSzkmnF+c6sIzHrVSV7KvOA1ohYExEHgTuB+UV15gN3pNv3ABdJUlp+Z0QciIi1QGvaXk8K27oDuPzof4LVhfTS0bJoyTaOgZp8NnTsg/aVWUdi1qtKJpUpwPqCzxvSspJ1IqID2AWM6+XYAH4s6UlJ1xXUmRARm9LtzcCEUkFJuk7SUklL29vb+/+rrPZs+jV74hjaouQfieo35bzkfeOT2cZh1ge1OFD/xog4l+Sy2gcl/W5xhYgIkuTzGyLi1oiYGxFzm5ubKxyqVYVNz7A8phE1+ccdGDsjGax3UrEaUMm/ZRuBwuk2U9OyknUkDQHGANt7OjYiut63Avfx2mWxLZImpW1NAraW8bdYrcrnYfOzLKvV8RSAXA6mnOukYjWhkkllCTBL0nRJw0gG3hcV1VkEXJ1uXwE8nPYyFgEL0tlh04FZwC8ljZQ0CkDSSOBtwHMl2roa+PcK/S6rJTtWw6G9LK/FmV+FppwHW5b5znqrekMq1XBEdEi6HngAaAJuj4hlkj4DLI2IRcBtwDcltQI7SBIPab27geVAB/DBiOiUNAG4LxnLZwjw7Yj4j/QrbwTulnQtsA74w0r9Nqshm34NUNs9FUiSSnTCpmfg5POzjsasWxVLKgARcT9wf1HZpwq29wNXdnPs54DPFZWtAV7fTf3twEVHGbLVmw1LYMixvLB/ataRHJ3Dg/VLnVSsqtXoyKVZH734BEydS0dl//1UeaMmwJiTYf0vs47ErEdOKla/DuxJ7kQ/qU7+ZX/SPFi/2M+st6rmpGL1a+OTyTjEyRdkHUl5nHwBvLIJXn4x60jMuuWkYvVr/WJAMPW3so6kPLqS4/rF2cZh1gMnFatf6xcnz3k/9visIymPE+fA8NHw4uNZR2LWLScVq0/5zmRQu17GUwByTTB1LrzonopVLycVq0+bn4EDu6HljVlHUl4nXQBbl8O+nVlHYlZSjc+zNOtG22PJ+7QLs41jgFoW/rBk+Tw1cffw4Lr//WV+nC89VtR246WVDM2sR+6pWH1qezRZiHH0pKwjKatfxSxejeFcmHuu98pmGXBSsfqT74QXfwEttdlL6ckhhrA4fxpvdFKxKuWkYvVny3OwfxdMq7PxlNSj+TOZkdvEJLZnHYrZb3BSsfqz9ufJex32VAAezZ8FwIVN7q1Y9XFSsfqz+mEYNwvG1Pgikt1YGSfRHqM9rmJVyUnF6suhfbDuMZhZzwtWi8fyZ6bjKl4HzKqLk4rVl3W/gI79MKOekwo8lj+TZu1ittZnHYrZEZxUrL6sfhiahtXteEqXxzrPBPAsMKs6TipWX1ofgpPfAMNGZh1JRb3EeFbnJ3lcxaqOk4rVj+2roX0FzHpb1pEMisfyZ3J+bgVD6cg6FLPDnFSsfiy7N3k/4/JMwxgsj+bPZKQOcF7uhaxDMTusoklF0sWSVkpqlbSwxP7hku5K9y+W1FKw74a0fKWkt6dlJ0l6RNJyScsk/VVB/U9L2ijp6fT1jkr+NqtCz92XLLhYp1OJi/0ifwYHo4k35X6ddShmh1UsqUhqAm4BLgHmAFdJmlNU7VpgZ0TMBL4E3JQeOwdYAJwBXAx8JW2vA/jriJgDXAB8sKjNL0XE2enr/kr9NqtC7Sth6zI4879kHcmg2cMIluZn83u5p7MOxeywSq5SPA9ojYg1AJLuBOYDywvqzAc+nW7fA9wsSWn5nRFxAFgrqRWYFxGPA5sAIuIVSSuAKUVtWp3qbuVegA8PuYcPNYnz7xtJ+33d16s3j+TP5uNDv80ktrOJcVmHY1bRy19TgMJJ9BvSspJ1IqID2AWM68ux6aWyc4DCJxZdL+kZSbdLOqFUUJKuk7RU0tL29vZ+/yirRsG7co+zOH867ZT8z163fpo/G4Dfa/IlMKsONTlQL+k44N+AD0fE7rT4H4EZwNkkvZkvljo2Im6NiLkRMbe5uXkwwrUKO10vMiO3ie/n35B1KINuVUxhQ4znotxTWYdiBlQ2qWwETir4PDUtK1lH0hBgDLC9p2MlDSVJKN+KiHu7KkTElojojIg88DWSy2/WAN7Z9DgdkeNHnaUfWlXfxI865/F7uV8zhj1ZB2NW0aSyBJglabqkYSQD74uK6iwCrk63rwAejohIyxeks8OmA7OAX6bjLbcBKyLi7wobklT4NKZ3A74rrCEEl+YW84v8GexkdNbBZOJ7nRcyTJ1c2uRn11v2KpZU0jGS64EHgBXA3RGxTNJnJF2WVrsNGJcOxH8UWJgeuwy4m2QA/j+AD0ZEJ3Ah8H7gLSWmDn9e0rOSngHeDHykUr/Nqse5WkVLbguL8r+ddSiZWRYtrMpPYX7TY1mHYlbZZ9Sn03rvLyr7VMH2fuDKbo79HPC5orJHAXVT//1HG6/VniuafsbeGM79nednHUqGxPc6L+S/Db2bqdqadTDW4GpyoN4M4BgO8K6mJ/hR/nxe5Zisw8nUvZ2/w6Fo4pqmB7IOxRqck4rVrLfnljBK+/hux+9lHUrmNjGOH+QvYEHTI7Dv5azDsQbmpGI1671DHqItP4FfxuysQ6kKt3a8k+O0H5bennUo1sCcVKwmzVEb83Ir+Wbn7xP+YwzAipjGzzpfB4/fDPt3ZR2ONSj/bbSa9MdNP+bVGM53O33pq9DnO94Dr26Hx76cdSjWoJxUrOaMZxeXNz3G9zovZDfHZR1OVVkW0+GsP4THb4Fdxfcam1Wek4rVnI8MuYcm8tzaeWnWoVSnt3wCIg+P/G3WkVgDclKxmnKq1rOg6WH+tfP3aYtJvR/QiE6YBuf/OTz9LdjshSVscDmpWA0JPj3kDvZwLF/uaJznpgzI7/w1HDMGHvgYRGQdjTUQJxWrGQuaHuG3m5bzfzr+iJcZlXU41e3YE+CiT8Lan8GT/5x1NNZAnFSsNuzayMeGfItfdM7hzs43Zx1NbZh7LZzyZnjgE7B9ddbRWINwUrHqFwE//ChD6WRhxwfoZvk3KybB/JthyDC4871w4JWsI7IG4KRi1e/Ze+CF/+ALHVfyYkzIOpraMmYqXPkvsO0FuO8vIJ/POiKrc04qVt02PgXf/xBM/S3+ufOSrKOpTae8Cd7+t/D8D+BnN2UdjdW5ii59b3ZUNj8H334PjBgP7/kW+c8tzTqimtCy8IclSqfyf4f8Llf+7EY+8eAW/rXzrSWPbbvR9/7Y0XFPxarTsvvgtrdCrgnedw+M8mWvoyM+0fGnPNR5Dp8d+s98fshX/fhhqwgnFasuB1+F7/8VfPcamHAGXPdTaPYqxOVwgGF84NBf8/86LucPmv6TR4Z/lPm5RwHfx2Ll46Ri1WPzc/C1N8OT/wIXfhiuuR9GTcw6qrqSJ8cXO/6Qdx78W9bGJL487CvcPPT/uddiZeMxFRtUpa73j2YPfznk+1zbdD8vcxwfOXQDjz50Fjz0kwwibAwrYhpXHvyf/EXTIj4y5N+YO3wlf3voj6Dz7dDk/y3YwPlPj2VC5Dlbq/mDpv/kvzQ9yggd4K6ON3FTxwJ2MDrr8BpCnhxf6bycn+VfzxeG/hP/MOwW+Pt7YcZbkhlj03/XPUXrt4omFUkXA18GmoCvR8SNRfuHA98AzgO2A++JiLZ03w3AtUAn8KGIeKCnNiVNB+4ExgFPAu+PiIOV/H3WRx0HYfcG2PwsC4d8l9drNWfm1jJK+9gfQ/lB/g18veMdPB8nZx1pQ1oW03nHwf/DRblf8fWpq2Dl/clilADNp8HJb4Ap58HUuTD+1GTyhFk3FBVabE5SE/AC8FZgA7AEuCoilhfU+UvgdRHxF5IWAO+OiPdImgN8B5gHTAYeBE5NDyvZpqS7gXsj4k5J/wT8OiL+sacY586dG0uXVsE01YiCRf8qvU3/6kceOg8kiaHzAHSkryO2D0LH/qROxz54ZQvsWg+7N8KuDbBnK12DwQdiCCviZJ7Jz+Cp/CwezJ/LHkYcxcmzcsuRZ47auDC3jN/OLeOcXCuj9SoA+2IYq2MyO2IUuxjJrhjJyxzH7hjBx949D4aPhuGjXnsNHQHKlXgJUDfvHPlZuR7qdvMur7pQSZKejIi5pfZVsqcyD2iNiDVpEHcC84HlBXXmA59Ot+8BbpaktPzOiDgArJXUmrZHqTYlrQDeAvxRWueOtN0ek8qAPf4VePizHPX/6OvU3hjOphjHSzGOl+J0NsUbeYlxrMyfxPNxMgcZmnWI1oM8OZ6LU3iu8xS+2vkuRJ7p2szZauX03IvM1EaO116m0s6Y3F7GsJchysMPvpN16CX0loSOsu2jOrwcie8o2rjkRjj3j8sQw5EqmVSmAOsLPm8Azu+uTkR0SNpFcvlqCvBE0bFT0u1SbY4DXo6IjhL1jyDpOuC69OMeSSv78ZtKGQ9sO8o2al2Jc9CeSSAZq9s/C23AI32rWrfnoB9q4xx84mrg6oEePa27HQ03UB8RtwK3lqs9SUu76wY2Cp+DhM+DzwH4HFTyPpWNwEkFn6emZSXrSBoCjCEZsO/u2O7KtwPHp210911mZlZhlUwqS4BZkqZLGgYsABYV1VnEa/2vK4CHI5k5sAhYIGl4OqtrFvDL7tpMj3kkbYO0zX+v4G8zM7MSKnb5Kx0juR54gGT67+0RsUzSZ4ClEbEIuA34ZjoQv4MkSZDWu5tkUL8D+GBEdAKUajP9yv8B3Cnps8Cv0rYHQ9kupdUwn4OEz4PPATT4OajYlGIzM2s8XvvLzMzKxknFzMzKxkmlHyT9X0nPS3pG0n2Sji/Yd4OkVkkrJb29oPzitKxV0sJMAi8jSVdKWiYpL2lu0b6GOAfF6v33dZF0u6Stkp4rKBsr6SeSVqXvJ6TlkvQP6Tl5RtK52UVePpJOkvSIpOXp34O/Sssb6jz0KCL86uMLeBswJN2+Cbgp3Z4D/BoYDkwHVpNMJGhKt08BhqV15mT9O47yHJwOzAZ+CswtKG+Yc1B0Pur69xX91t8FzgWeKyj7PLAw3V5Y8HfiHcCPSG75vgBYnHX8ZToHk4Bz0+1RJMtGzWm089DTyz2VfoiIH8drd+0/QXI/DBQsKxMRa4GuZWUOL1UTyeKWXUvV1KyIWBERpVYhaJhzUKTef99hEfGfJLM0C80nWRaJ9P3ygvJvROIJkvvIJg1KoBUUEZsi4ql0+xVgBcnqHQ11HnripDJwf0ryLxAovSTNlB7K61GjnoN6/329mRARm9LtzUDXc5/r/rxIagHOARbTwOehWMMt09IbSQ8CpR4i8fGI+Pe0zsdJ7p/51mDGNlj6cg7MikVESGqIexQkHQf8G/DhiNitgsUhG+k8lOKkUiQifr+n/ZKuAd4JXBTpRVN6XpKmt6Vqqk5v56AbdXUO+qEvyxHVsy2SJkXEpvSyzta0vG7Pi6ShJAnlWxFxb1rccOehO7781Q/pA8L+O3BZRLxasKtfy8oMdtyDpFHPQb3/vt4ULrVUuDzSIuCP09lPFwC7Ci4P1az00Ry3ASsi4u8KdjXUeehR1jMFaulFMvi8Hng6ff1Twb6Pk8wCWglcUlD+DpIZIqtJLh9l/juO8hy8m+S68AFgC/BAo52DEuekrn9fwe/8DrAJOJT+GbiW5LETDwGrSB6mNzatK+CW9Jw8S8FMwVp+AW8keRjSMwX/H3hHo52Hnl5epsXMzMrGl7/MzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMqoikpp4+d3OMJPnvslUF/0E0G0SS3ifpl5KelvRVSU2S9kj6oqRfA28o8fmjkp5LXx9O22lJn+HyDeA5jlwKxCwzTipmg0TS6cB7gAsj4mygE3gvMJLkORuvj4hHCz8D+4A/Ac4neR7HBySdkzY5C/hKRJwREesG99eYleYFJc0Gz0XAecCSdFXbY0kWHuwkWaCwS+HnNwL3RcReAEn3Ar9DsqbUukie0WFWNZxUzAaPgDsi4oYjCqW/iYjOgqL9RZ+7s7es0ZmVgS9/mQ2eh4ArJJ0Ih59rPq2XY34OXC5phKSRJAt6/rzCcZoNmHsqZoMkIpZL+gTw43S21iHgg70c85SkfyF5jADA1yPiV+lTB82qjlcpNjOzsvHlLzMzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMzKxsnFTMzK5v/D3zr4G2YugH4AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -229,31 +229,22 @@
},
{
"cell_type": "code",
"execution_count": 48,
"execution_count": 10,
"id": "58da6063",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
" [ 0. , 22327. , 22323. , ..., 22406.5, 22446. , 0. ],\n",
" [ 0. , 22350.5, 22335.5, ..., 22429. , 22390. , 0. ],\n",
" ...,\n",
" [ 0. , 22099. , 22125. , ..., 22823.5, 22817. , 0. ],\n",
" [ 0. , 22140. , 22172.5, ..., 22774. , 22771. , 0. ],\n",
" [ 0. , 0. , 0. , ..., 0. , 0. , 0. ]])"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"prediction = new_pred.reshape((510,638))\n",
"prediction = np.pad(prediction, pad_width=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a74c686c",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment