Commit cec97fe9 authored by Nathaniel Callens's avatar Nathaniel Callens

wavelet file added

parent 9fd6d565
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 76,
"id": "dbef8759", "id": "dbef8759",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
"from PIL import Image\n", "from PIL import Image\n",
"from scipy.optimize import minimize\n", "from scipy.optimize import minimize\n",
"from time import time\n", "from time import time\n",
"from numpy import linalg as la" "from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde\n",
"import seaborn as sns\n",
"import pywt"
] ]
}, },
{ {
...@@ -87,46 +90,33 @@ ...@@ -87,46 +90,33 @@
" fix this later. 1/25/22\n", " fix this later. 1/25/22\n",
" \"\"\"\n", " \"\"\"\n",
" \n", " \n",
"\n",
" image = tiff_list[i]\n", " image = tiff_list[i]\n",
" image = Image.open(image) #Open the image and read it as an Image object\n", " image = Image.open(image) #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 = 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", " image = image.astype(int)\n",
" row, col = image.shape\n", " A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation\n",
" \"\"\"predict = np.empty([row,col]) # create a empty matrix to update prediction\n", " z0 = image[0:-2,0:-2] # get all the first pixel for the entire image\n",
" predict[0,:] = np.copy(image[0,:]) # keep the first row from the image\n", " z1 = image[0:-2,1:-1] # get all the second pixel for the entire image\n",
" predict[:,0] = np.copy(image[:,0]) # keep the first columen from the image\n", " z2 = image[0:-2,2::] # get all the third pixel for the entire image\n",
" predict[-1,:] = np.copy(image[-1,:]) # keep the first row from the image\n", " z3 = image[1:-1,0:-2] # get all the forth pixel for the entire image\n",
" predict[:,-1] = np.copy(image[:,-1]) # keep the first columen from the image\n", " # calculate the out put of the system of equation\n",
" diff = np.empty([row,col])\n",
" diff[0,:] = np.zeros(col) # keep the first row from the image\n",
" diff[:,0] = np.zeros(row)\n",
" diff[-1,:] = np.zeros(col) # keep the first row from the image\n",
" diff[:,-1] = np.zeros(row)\"\"\"\n",
" A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]])\n",
" z0 = image[0:-2,0:-2]\n",
" z1 = image[0:-2,1:-1]\n",
" z2 = image[0:-2,2::]\n",
" z3 = image[1:-1,0:-2]\n",
" y0 = np.ravel(-z0+z2-z3)\n", " y0 = np.ravel(-z0+z2-z3)\n",
" y1 = np.ravel(z0+z1+z2)\n", " y1 = np.ravel(z0+z1+z2)\n",
" y2 = np.ravel(-z0-z1-z2-z3)\n", " y2 = np.ravel(-z0-z1-z2-z3)\n",
" y = np.vstack((y0,y1,y2))\n", " y = np.vstack((y0,y1,y2))\n",
" predict = la.solve(A,y)[-1]\n", " # use numpy solver to solve the system of equations all at once\n",
" #diff = [(np.max([z0[r,c],z1[r,c],z2[r,c],z3[r,c]])-np.min([z0[r,c],z1[r,c],z2[r,c],z3[r,c]])) for r in range(0,row-2) for c in range(0,col-2)]\n", " predict = np.linalg.solve(A,y)[-1]\n",
" '''\n", " # flatten the neighbor pixlels and stack them together\n",
" for r in range(1,row-1): # loop through the rth row\n", " z0 = np.ravel(z0)\n",
" for c in range(1,col-1): # loop through the cth column\n", " z1 = np.ravel(z1)\n",
" actual_surrounding = np.array([image[r-1,c-1], image[r-1,c], image[r-1,c+1], image[r,c-1]])\n", " z2 = np.ravel(z2)\n",
" #z = np.array([int(image[r-1,c-1]), int(image[r-1,c]), int(image[r-1,c+1]), int(image[r,c-1])])\n", " z3 = np.ravel(z3)\n",
" z = np.array([image[r-1,c-1], image[r-1,c], image[r-1,c+1], image[r,c-1]])\n", " neighbor = np.vstack((z0,z1,z2,z3)).T\n",
" y = np.array([-z[0]+z[2]-z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n", " # calculate the difference\n",
" predict[r,c] = np.linalg.solve(A,y)[-1]\n", " diff = np.max(neighbor,axis = 1) - np.min(neighbor, axis=1)\n",
" diff[r,c] = (np.max(actual_surrounding)-np.min(actual_surrounding))\n", " # flatten the image to a vector\n",
" predict = np.ravel(predict[1:-1,1:-1])\n", " image_ravel = np.ravel(image[1:-1,1:-1])\n",
" diff = np.ravel(diff[1:-1,1:-1])'''\n", " return image_ravel, predict, diff, image"
" image = np.ravel(image[1:-1,1:-1])\n",
" return image, predict#, diff"
] ]
}, },
{ {
...@@ -153,13 +143,13 @@ ...@@ -153,13 +143,13 @@
" error1 = np.abs(image_1-predict_1)\n", " error1 = np.abs(image_1-predict_1)\n",
" error_mean1.append(np.mean(np.ravel(error1)))\"\"\"\n", " error_mean1.append(np.mean(np.ravel(error1)))\"\"\"\n",
" start = time()\n", " start = time()\n",
" image, predict = plot_hist(num_images, i)\n", " image, predict, difference, non_ravel = plot_hist(num_images, i)\n",
" stop = time()\n", " stop = time()\n",
" times.append(stop-start)\n", " times.append(stop-start)\n",
" error = np.abs(image-predict)\n", " error = np.abs(image-predict)\n",
" all_error.append(np.ravel(error))\n", " all_error.append(np.ravel(error))\n",
" error_mean.append(np.mean(np.ravel(error)))\n", " error_mean.append(np.mean(np.ravel(error)))\n",
" #diff_mean.append(np.mean(np.ravel(difference)))\n", " diff_mean.append(np.mean(np.ravel(difference)))\n",
" \n", " \n",
"#image, predict, difference = plot_hist(images, 0)" "#image, predict, difference = plot_hist(images, 0)"
] ]
...@@ -175,67 +165,40 @@ ...@@ -175,67 +165,40 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Average Error First and Second Added: 20.017164930235474\n", "Average Error First and Second Added: 20.017164930235474\n",
"233.22663391021266\n",
"Standard Deviaiton of Mean Errors: 0.16101183692475135\n", "Standard Deviaiton of Mean Errors: 0.16101183692475135\n",
"Average Time per Image for First: 0.023412495851516724\n" "Average Difference: 53.678648426455226\n",
"Average Time per Image for First: 0.10891032218933105\n"
] ]
} }
], ],
"source": [ "source": [
"print(f\"Average Error First and Second Added: {np.mean(error_mean)}\")\n", "print(f\"Average Error First and Second Added: {np.mean(error_mean)}\")\n",
"print(np.std(image))\n",
"print(f\"Standard Deviaiton of Mean Errors: {np.sqrt(np.var(error_mean))}\")\n", "print(f\"Standard Deviaiton of Mean Errors: {np.sqrt(np.var(error_mean))}\")\n",
"#print(f\"Average Difference: {np.mean(diff_mean)}\")\n", "print(f\"Average Difference: {np.mean(diff_mean)}\")\n",
"print(f\"Average Time per Image for First: {np.mean(times)}\")" "print(f\"Average Time per Image for First: {np.mean(times)}\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 6,
"id": "f592fa32", "id": "4c05b947",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[4 5]\n",
"[4 5]\n"
]
}
],
"source": [ "source": [
"b = np.arange(9).reshape((3,3))\n", "new_image, new_pred, new_diff, no_ravel = plot_hist(images, 10)"
"print(b)\n",
"print(b[1,1::])\n",
"print(b[1,1:])"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 7,
"id": "dda442ae", "id": "dda442ae",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{
"ename": "NameError",
"evalue": "name 'difference' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_10808/722042198.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0max\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_subplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpredict\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mimage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdifference\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'o'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0malpha\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrcParams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'font.size'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'difference' is not defined"
]
},
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 720x720 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
}, },
"metadata": { "metadata": {
...@@ -245,96 +208,172 @@ ...@@ -245,96 +208,172 @@
} }
], ],
"source": [ "source": [
"fig = plt.figure(figsize = (10,10))\n", "new_error = np.abs(new_image-new_pred)\n",
"ax = fig.add_subplot()\n", "plt.hist(new_error, bins=20, density=True)\n",
"x = np.abs(predict-image)\n", "sns.kdeplot(new_error)\n",
"y = difference\n", "plt.xlabel(\"error\")\n",
"plt.plot(x,y,'o',alpha = 0.2)\n", "plt.show()\n"
"plt.rcParams.update({'font.size': 20})\n",
"plt.xlabel(\"differnece to the true value\" )\n",
"plt.ylabel(\"differnece of min and max of true value of the surroundings\")\n",
"plt.show()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"id": "58da6063", "id": "58da6063",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"image = Image.open(images[0]) #Open the image and read it as an Image object\n", "plt.hist(new_image, bins=25, density=True)\n",
"image = np.array(image)[1:,:]\n", "sns.kdeplot(new_image)\n",
"#z = np.array([image[1-1,1-1], image[1-1,1], image[1-1,1+1], image[1,1-1]])\n", "plt.xlabel(\"Actual Pixel Value\")\n",
"z = np.array([22554,22552,22519,22561])\n", "plt.show()"
"print(z)\n",
"'''A = np.array([[-3,0,1],[0,-3,3],[-1,-3,4]])\n",
"y = np.array([z[0]-z[2]+z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n",
"a,b,c = np.linalg.solve(A,y)'''\n",
"A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]])\n",
"y = np.array([-z[0]+z[2]-z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n",
"print(y)\n",
"a,b,c = np.linalg.solve(A,y)\n",
"print(a,b,c)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 79,
"id": "2562feeb", "id": "2562feeb",
"metadata": { "metadata": {
"scrolled": false "scrolled": false
}, },
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(512, 640)\n",
"1310832\n",
"9\n"
]
}
],
"source": [ "source": [
"i0 = (a*(-1) + b*(1) + c)\n", "f_r = no_ravel[0]\n",
"i1 = (a*(0) + b*(1) + c)\n", "print(no_ravel.shape)\n",
"i2 = (a*(1) + b*(1) + c)\n", "print(sys.getsizeof(no_ravel))\n",
"i3 = (a*(-1) + b*(0) + c)\n", "print((256).bit_length())"
"print(sum([(i0-z[0])**2,(i1-z[1])**2,(i2-z[2])**2,(i3-z[3])**2]))\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 62,
"id": "470cc137", "id": "470cc137",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5.667000202436157e-12\n"
]
}
],
"source": [ "source": [
"a = 0\n", "coeffs = pywt.dwt2(no_ravel, 'bior1.3')\n",
"b = 2\n", "LL, (LH, HL, HH) = coeffs\n",
"c = 2\n", "decompress = pywt.idwt2(coeffs, 'bior1.3')\n",
"i0 = (a*(-1) + b*(1) + c)\n", "print(np.mean(np.abs(decompress-no_ravel)))\n"
"i1 = (a*(0) + b*(1) + c)\n",
"i2 = (a*(1) + b*(1) + c)\n",
"i3 = (a*(-1) + b*(0) + c)\n",
"print(sum([(i0-z[0])**2,(i1-z[1])**2,(i2-z[2])**2,(i3-z[3])**2]))\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 59,
"id": "3292b395", "id": "3292b395",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[72, 101, 108, 108, 111, 32, 109, 121, 32, 110, 97, 109, 101, 32, 105, 115, 32, 83, 99, 111, 117, 116]\n",
"256\n",
"71\n"
]
}
],
"source": [ "source": [
"#z = np.hstack((image[0,:3], image[1,0]))\n", "def compress(uncompressed):\n",
"#x = np.array([-1,0,1,-1])\n", " \"\"\"Compress a string to a list of output symbols.\"\"\"\n",
"#y = np.array([-1,-1,-1,0])\n", " \n",
"A = np.array([[-3,0,1],[0,-3,3],[1,3,-4]])\n", " # Build the dictionary.\n",
"#y = np.array([z[0]-z[2]+z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n", " dict_size = 256\n",
"y = np.array([[1,2,3],[4,5,6],[7,8,9]])\n", " dictionary = dict((chr(i), i) for i in range(dict_size))\n",
"print(np.linalg.solve(A,y))" " # in Python 3: dictionary = {chr(i): i for i in range(dict_size)}\n",
"\n",
" w = \"\"\n",
" result = []\n",
" for c in uncompressed:\n",
" wc = w + c\n",
" if wc in dictionary:\n",
" w = wc\n",
" else:\n",
" result.append(dictionary[w])\n",
" # Add wc to the dictionary.\n",
" dictionary[wc] = dict_size\n",
" dict_size += 1\n",
" w = c\n",
" \n",
" # Output the code for w.\n",
" if w:\n",
" result.append(dictionary[w])\n",
" return result\n",
"\n",
"store = compress(\"Hello my name is Scout\")\n",
"print(store)\n",
"print(sys.getsizeof(store))\n",
"print(sys.getsizeof(\"Hello my name is Scout\"))"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 88,
"id": "f9687830", "id": "f9687830",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.01910218596458435\n"
]
}
],
"source": [ "source": [
"0.5**2 + 1.5**2" "def wavelet(num_images, i): \n",
"\n",
" image = Image.open(num_images[i]) #Open the image and read it as an Image object\n",
" image = np.array(im)[1:,:]\n",
" coeffs = pywt.dwt2(image, 'bior1.3')\n",
" return coeffs\n",
"\n",
"def huffman(coeffs):\n",
" for i in range(len(coeffs)):\n",
" \n",
"\n",
"coef, t = wavelet(num_images)\n",
"\n",
"def wave_decompress(coeffs):\n",
" times = []\n",
" for i in range(len(coeffs)):\n",
" start = time()\n",
" decompress = pywt.idwt2(coeffs[i], 'bior1.3')\n",
" stop = time()\n",
" times.append(stop-start)\n",
" return times\n",
"ti = wave_decompress(coef)\n",
"print(np.mean(ti))"
] ]
}, },
{ {
...@@ -343,12 +382,7 @@ ...@@ -343,12 +382,7 @@
"id": "e98eed4b", "id": "e98eed4b",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": []
"y1= [0,1,2,3]\n",
"y2=[4,5,6,7]\n",
"y3=[8,9,10,11]\n",
"np.vstack((y1,y2,y3)).T"
]
}, },
{ {
"cell_type": "code", "cell_type": "code",
......
{
"cells": [
{
"cell_type": "code",
"execution_count": 6,
"id": "dbef8759",
"metadata": {
"id": "dbef8759"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"from itertools import product\n",
"import os\n",
"import sys\n",
"from PIL import Image\n",
"from scipy.optimize import minimize\n",
"from time import time\n",
"from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde\n",
"import seaborn as sns\n",
"import pywt\n",
"import dippykit as dp"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "b7a550e0",
"metadata": {
"id": "b7a550e0"
},
"outputs": [],
"source": [
"def file_extractor(dirname=\"images\"):\n",
" files = os.listdir(dirname)\n",
" scenes = []\n",
" for file in files:\n",
" scenes.append(os.path.join(dirname, file))\n",
" return scenes\n",
"\n",
"def image_extractor(scenes):\n",
" image_folder = []\n",
" for scene in scenes:\n",
" files = os.listdir(scene)\n",
" for file in files:\n",
" image_folder.append(os.path.join(scene, file))\n",
" images = []\n",
" for folder in image_folder:\n",
" ims = os.listdir(folder)\n",
" for im in ims:\n",
" if im[-4:] == \".jp4\" or im[-7:] == \"_6.tiff\":\n",
" continue\n",
" else:\n",
" images.append(os.path.join(folder, im))\n",
" return images #returns a list of file paths to .tiff files in the specified directory given in file_extractor\n",
"\n",
"def im_distribution(images, num):\n",
" \"\"\"\n",
" Function that extracts tiff files from specific cameras and returns a list of all\n",
" the tiff files corresponding to that camera. i.e. all pictures labeled \"_7.tiff\" or otherwise\n",
" specified camera numbers.\n",
" \n",
" Parameters:\n",
" images (list): list of all tiff files, regardless of classification. This is NOT a list of directories but\n",
" of specific tiff files that can be opened right away. This is the list that we iterate through and \n",
" divide.\n",
" \n",
" num (str): a string designation for the camera number that we want to extract i.e. \"14\" for double digits\n",
" of \"_1\" for single digits.\n",
" \n",
" Returns:\n",
" tiff (list): A list of tiff files that have the specified designation from num. They are the files extracted\n",
" from the 'images' list that correspond to the given num.\n",
" \"\"\"\n",
" tiff = []\n",
" for im in images:\n",
" if im[-7:-5] == num:\n",
" tiff.append(im)\n",
" return tiff"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "9ed20f84",
"metadata": {
"id": "9ed20f84"
},
"outputs": [],
"source": [
"def plot_hist(tiff_list, i):\n",
" \"\"\"\n",
" This function is the leftovers from the first attempt to plot histograms.\n",
" As it stands it needs some work in order to function again. We will\n",
" fix this later. 1/25/22\n",
" \"\"\"\n",
" \n",
" image = tiff_list[i]\n",
" image = Image.open(image) #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",
" A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation\n",
" z0 = image[0:-2,0:-2] # get all the first pixel for the entire image\n",
" z1 = image[0:-2,1:-1] # get all the second pixel for the entire image\n",
" z2 = image[0:-2,2::] # get all the third pixel for the entire image\n",
" z3 = image[1:-1,0:-2] # get all the forth pixel for the entire image\n",
" # calculate the out put of the system of equation\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.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",
" # calculate the difference\n",
" diff = np.max(neighbor,axis = 1) - np.min(neighbor, axis=1)\n",
" # flatten the image to a vector\n",
" image_ravel = np.ravel(image[1:-1,1:-1])\n",
" return image_ravel, predict, diff, image"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "8e3ef654",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 357
},
"id": "8e3ef654",
"outputId": "92f06bb6-c1ab-4e46-e53d-385ed892c7d9"
},
"outputs": [
{
"output_type": "error",
"ename": "FileNotFoundError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-9-80eed1605ff2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mscenes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfile_extractor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mimages\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimage_extractor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscenes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mnum_images\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mim_distribution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"_9\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0merror_mean\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0merror_mean1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-7-8baf51e34e4c>\u001b[0m in \u001b[0;36mfile_extractor\u001b[0;34m(dirname)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfile_extractor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdirname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"images\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mfiles\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlistdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdirname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mscenes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfile\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mscenes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdirname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'images'"
]
}
],
"source": [
"scenes = file_extractor()\n",
"images = image_extractor(scenes)\n",
"num_images = im_distribution(images, \"_9\")\n",
"error_mean = []\n",
"error_mean1 = []\n",
"diff_mean = []\n",
"times = []\n",
"times1 = []\n",
"all_error = []\n",
"for i in range(len(num_images)):\n",
" \"\"\"start1 = time()\n",
" image_1, predict_1, difference_1, x_s_1 = plot_hist(num_images, i, \"second\")\n",
" stop1 = time()\n",
" times1.append(stop1-start1)\n",
" error1 = np.abs(image_1-predict_1)\n",
" error_mean1.append(np.mean(np.ravel(error1)))\"\"\"\n",
" start = time()\n",
" image, predict, difference, non_ravel = plot_hist(num_images, i)\n",
" stop = time()\n",
" times.append(stop-start)\n",
" error = np.abs(image-predict)\n",
" all_error.append(np.ravel(error))\n",
" error_mean.append(np.mean(np.ravel(error)))\n",
" diff_mean.append(np.mean(np.ravel(difference)))\n",
" \n",
"#image, predict, difference = plot_hist(images, 0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fa65dcd6",
"metadata": {
"id": "fa65dcd6",
"outputId": "254b4654-1566-4e76-b774-e5a920819891"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average Error First and Second Added: 20.017164930235474\n",
"Standard Deviaiton of Mean Errors: 0.16101183692475135\n",
"Average Difference: 53.678648426455226\n",
"Average Time per Image for First: 0.10891032218933105\n"
]
}
],
"source": [
"print(f\"Average Error First and Second Added: {np.mean(error_mean)}\")\n",
"print(f\"Standard Deviaiton of Mean Errors: {np.sqrt(np.var(error_mean))}\")\n",
"print(f\"Average Difference: {np.mean(diff_mean)}\")\n",
"print(f\"Average Time per Image for First: {np.mean(times)}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4c05b947",
"metadata": {
"id": "4c05b947"
},
"outputs": [],
"source": [
"new_image, new_pred, new_diff, no_ravel = plot_hist(images, 10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dda442ae",
"metadata": {
"id": "dda442ae",
"outputId": "98bbbfe0-e9d8-46f9-89af-fd3f226b6b58"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"new_error = np.abs(new_image-new_pred)\n",
"plt.hist(new_error, bins=20, density=True)\n",
"sns.kdeplot(new_error)\n",
"plt.xlabel(\"error\")\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "58da6063",
"metadata": {
"id": "58da6063",
"outputId": "8529b3dd-68a5-4a10-8310-0549a2af2319"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.hist(new_image, bins=25, density=True)\n",
"sns.kdeplot(new_image)\n",
"plt.xlabel(\"Actual Pixel Value\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2562feeb",
"metadata": {
"scrolled": false,
"id": "2562feeb",
"outputId": "3838d616-2eda-49c5-d434-45acf24cfe5b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(512, 640)\n",
"1310832\n",
"9\n"
]
}
],
"source": [
"f_r = no_ravel[0]\n",
"print(no_ravel.shape)\n",
"print(sys.getsizeof(no_ravel))\n",
"print((256).bit_length())"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "470cc137",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"id": "470cc137",
"outputId": "2c9b7aa9-74b9-41db-d1ee-39bb20a005b5"
},
"outputs": [
{
"output_type": "error",
"ename": "NameError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-31-7c411a9343d9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcoeffs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpywt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdwt2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mno_ravel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'bior1.3'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoeffs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mLL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mLH\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcoeffs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdecompress\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpywt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0midwt2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoeffs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'bior1.3'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdecompress\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mno_ravel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'no_ravel' is not defined"
]
}
],
"source": [
"coeffs = pywt.dwt2(no_ravel, 'bior1.3')\n",
"print(len(coeffs))\n",
"LL, (LH, HL, HH) = coeffs\n",
"decompress = pywt.idwt2(coeffs, 'bior1.3')\n",
"print(np.mean(np.abs(decompress-no_ravel)))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3292b395",
"metadata": {
"id": "3292b395",
"outputId": "a01866ee-fa9d-4f78-c36a-a24b76ee2c34"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[72, 101, 108, 108, 111, 32, 109, 121, 32, 110, 97, 109, 101, 32, 105, 115, 32, 83, 99, 111, 117, 116]\n",
"256\n",
"71\n"
]
}
],
"source": [
"def compress(uncompressed):\n",
" \"\"\"Compress a string to a list of output symbols.\"\"\"\n",
" \n",
" # Build the dictionary.\n",
" dict_size = 256\n",
" dictionary = dict((chr(i), i) for i in range(dict_size))\n",
" # in Python 3: dictionary = {chr(i): i for i in range(dict_size)}\n",
"\n",
" w = \"\"\n",
" result = []\n",
" for c in uncompressed:\n",
" wc = w + c\n",
" if wc in dictionary:\n",
" w = wc\n",
" else:\n",
" result.append(dictionary[w])\n",
" # Add wc to the dictionary.\n",
" dictionary[wc] = dict_size\n",
" dict_size += 1\n",
" w = c\n",
" \n",
" # Output the code for w.\n",
" if w:\n",
" result.append(dictionary[w])\n",
" return result\n",
"\n",
"store = compress(\"Hello my name is Scout\")\n",
"print(store)\n",
"print(sys.getsizeof(store))\n",
"print(sys.getsizeof(\"Hello my name is Scout\"))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f9687830",
"metadata": {
"id": "f9687830",
"outputId": "1ebd287f-e5e6-4993-b78c-5c0d46f7b9b0"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.01910218596458435\n"
]
}
],
"source": [
"def wavelet(num_images, i): \n",
"\n",
" image = Image.open(num_images[i]) #Open the image and read it as an Image object\n",
" image = np.array(im)[1:,:]\n",
" coeffs = pywt.dwt2(image, 'bior1.3')\n",
" return coeffs\n",
"\n",
"def huffman(coeffs):\n",
" for i in range(len(coeffs)):\n",
" \n",
"\n",
"coef = wavelet(num_images)\n",
"\n",
"def wave_decompress(coeffs):\n",
" times = []\n",
" for i in range(len(coeffs)):\n",
" start = time()\n",
" decompress = pywt.idwt2(coeffs[i], 'bior1.3')\n",
" stop = time()\n",
" times.append(stop-start)\n",
" return times\n",
"ti = wave_decompress(coef)\n",
"print(np.mean(ti))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "e98eed4b",
"metadata": {
"id": "e98eed4b"
},
"outputs": [],
"source": [
"image_huff = Image.open(\"1640843156_729797_0.tiff\")\n",
"image_huff = np.array(image_huff)[1:,:]\n",
"a, (b,c,d) = pywt.dwt2(image_huff, 'bior1.3')\n",
"coeffs = [a.astype(int), b.astype(int), c.astype(int), d.astype(int)]\n",
"huffs = []\n",
"for i in range(len(coeffs)):\n",
" huffs.append(dp.coding.huffman_encode(coeffs[i].ravel()))"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "b7e88aab",
"metadata": {
"id": "b7e88aab"
},
"outputs": [],
"source": [
"recon_coeff = []\n",
"for i in range(len(huffs)):\n",
" recon_coeff.append(dp.coding.huffman_decode(huffs[i][0], huffs[i][2], huffs[i][1]))\n",
"coeffs = recon_coeff[0].reshape((258,322)), (recon_coeff[1].reshape((258,322)),\\\n",
" recon_coeff[2].reshape((258,322)), recon_coeff[3].reshape((258,322)))\n",
"decompress = pywt.idwt2(coeffs, 'bior1.3')"
]
},
{
"cell_type": "code",
"source": [
"print(np.mean(np.abs(decompress-image_huff)))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "syg2KPtp5c68",
"outputId": "bfd2ffaa-b942-45c0-af8a-1b7d8a2a14e9"
},
"id": "syg2KPtp5c68",
"execution_count": 40,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.46880903243908045\n"
]
}
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.11"
},
"colab": {
"name": "Wavelet_Huffman.ipynb",
"provenance": [],
"collapsed_sections": []
}
},
"nbformat": 4,
"nbformat_minor": 5
}
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 76,
"id": "dbef8759", "id": "dbef8759",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
"from PIL import Image\n", "from PIL import Image\n",
"from scipy.optimize import minimize\n", "from scipy.optimize import minimize\n",
"from time import time\n", "from time import time\n",
"from numpy import linalg as la" "from numpy import linalg as la\n",
"from scipy.stats import gaussian_kde\n",
"import seaborn as sns\n",
"import pywt"
] ]
}, },
{ {
...@@ -87,46 +90,33 @@ ...@@ -87,46 +90,33 @@
" fix this later. 1/25/22\n", " fix this later. 1/25/22\n",
" \"\"\"\n", " \"\"\"\n",
" \n", " \n",
"\n",
" image = tiff_list[i]\n", " image = tiff_list[i]\n",
" image = Image.open(image) #Open the image and read it as an Image object\n", " image = Image.open(image) #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 = 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", " image = image.astype(int)\n",
" row, col = image.shape\n", " A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation\n",
" \"\"\"predict = np.empty([row,col]) # create a empty matrix to update prediction\n", " z0 = image[0:-2,0:-2] # get all the first pixel for the entire image\n",
" predict[0,:] = np.copy(image[0,:]) # keep the first row from the image\n", " z1 = image[0:-2,1:-1] # get all the second pixel for the entire image\n",
" predict[:,0] = np.copy(image[:,0]) # keep the first columen from the image\n", " z2 = image[0:-2,2::] # get all the third pixel for the entire image\n",
" predict[-1,:] = np.copy(image[-1,:]) # keep the first row from the image\n", " z3 = image[1:-1,0:-2] # get all the forth pixel for the entire image\n",
" predict[:,-1] = np.copy(image[:,-1]) # keep the first columen from the image\n", " # calculate the out put of the system of equation\n",
" diff = np.empty([row,col])\n",
" diff[0,:] = np.zeros(col) # keep the first row from the image\n",
" diff[:,0] = np.zeros(row)\n",
" diff[-1,:] = np.zeros(col) # keep the first row from the image\n",
" diff[:,-1] = np.zeros(row)\"\"\"\n",
" A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]])\n",
" z0 = image[0:-2,0:-2]\n",
" z1 = image[0:-2,1:-1]\n",
" z2 = image[0:-2,2::]\n",
" z3 = image[1:-1,0:-2]\n",
" y0 = np.ravel(-z0+z2-z3)\n", " y0 = np.ravel(-z0+z2-z3)\n",
" y1 = np.ravel(z0+z1+z2)\n", " y1 = np.ravel(z0+z1+z2)\n",
" y2 = np.ravel(-z0-z1-z2-z3)\n", " y2 = np.ravel(-z0-z1-z2-z3)\n",
" y = np.vstack((y0,y1,y2))\n", " y = np.vstack((y0,y1,y2))\n",
" predict = la.solve(A,y)[-1]\n", " # use numpy solver to solve the system of equations all at once\n",
" #diff = [(np.max([z0[r,c],z1[r,c],z2[r,c],z3[r,c]])-np.min([z0[r,c],z1[r,c],z2[r,c],z3[r,c]])) for r in range(0,row-2) for c in range(0,col-2)]\n", " predict = np.linalg.solve(A,y)[-1]\n",
" '''\n", " # flatten the neighbor pixlels and stack them together\n",
" for r in range(1,row-1): # loop through the rth row\n", " z0 = np.ravel(z0)\n",
" for c in range(1,col-1): # loop through the cth column\n", " z1 = np.ravel(z1)\n",
" actual_surrounding = np.array([image[r-1,c-1], image[r-1,c], image[r-1,c+1], image[r,c-1]])\n", " z2 = np.ravel(z2)\n",
" #z = np.array([int(image[r-1,c-1]), int(image[r-1,c]), int(image[r-1,c+1]), int(image[r,c-1])])\n", " z3 = np.ravel(z3)\n",
" z = np.array([image[r-1,c-1], image[r-1,c], image[r-1,c+1], image[r,c-1]])\n", " neighbor = np.vstack((z0,z1,z2,z3)).T\n",
" y = np.array([-z[0]+z[2]-z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n", " # calculate the difference\n",
" predict[r,c] = np.linalg.solve(A,y)[-1]\n", " diff = np.max(neighbor,axis = 1) - np.min(neighbor, axis=1)\n",
" diff[r,c] = (np.max(actual_surrounding)-np.min(actual_surrounding))\n", " # flatten the image to a vector\n",
" predict = np.ravel(predict[1:-1,1:-1])\n", " image_ravel = np.ravel(image[1:-1,1:-1])\n",
" diff = np.ravel(diff[1:-1,1:-1])'''\n", " return image_ravel, predict, diff, image"
" image = np.ravel(image[1:-1,1:-1])\n",
" return image, predict#, diff"
] ]
}, },
{ {
...@@ -153,13 +143,13 @@ ...@@ -153,13 +143,13 @@
" error1 = np.abs(image_1-predict_1)\n", " error1 = np.abs(image_1-predict_1)\n",
" error_mean1.append(np.mean(np.ravel(error1)))\"\"\"\n", " error_mean1.append(np.mean(np.ravel(error1)))\"\"\"\n",
" start = time()\n", " start = time()\n",
" image, predict = plot_hist(num_images, i)\n", " image, predict, difference, non_ravel = plot_hist(num_images, i)\n",
" stop = time()\n", " stop = time()\n",
" times.append(stop-start)\n", " times.append(stop-start)\n",
" error = np.abs(image-predict)\n", " error = np.abs(image-predict)\n",
" all_error.append(np.ravel(error))\n", " all_error.append(np.ravel(error))\n",
" error_mean.append(np.mean(np.ravel(error)))\n", " error_mean.append(np.mean(np.ravel(error)))\n",
" #diff_mean.append(np.mean(np.ravel(difference)))\n", " diff_mean.append(np.mean(np.ravel(difference)))\n",
" \n", " \n",
"#image, predict, difference = plot_hist(images, 0)" "#image, predict, difference = plot_hist(images, 0)"
] ]
...@@ -175,67 +165,40 @@ ...@@ -175,67 +165,40 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Average Error First and Second Added: 20.017164930235474\n", "Average Error First and Second Added: 20.017164930235474\n",
"233.22663391021266\n",
"Standard Deviaiton of Mean Errors: 0.16101183692475135\n", "Standard Deviaiton of Mean Errors: 0.16101183692475135\n",
"Average Time per Image for First: 0.023412495851516724\n" "Average Difference: 53.678648426455226\n",
"Average Time per Image for First: 0.10891032218933105\n"
] ]
} }
], ],
"source": [ "source": [
"print(f\"Average Error First and Second Added: {np.mean(error_mean)}\")\n", "print(f\"Average Error First and Second Added: {np.mean(error_mean)}\")\n",
"print(np.std(image))\n",
"print(f\"Standard Deviaiton of Mean Errors: {np.sqrt(np.var(error_mean))}\")\n", "print(f\"Standard Deviaiton of Mean Errors: {np.sqrt(np.var(error_mean))}\")\n",
"#print(f\"Average Difference: {np.mean(diff_mean)}\")\n", "print(f\"Average Difference: {np.mean(diff_mean)}\")\n",
"print(f\"Average Time per Image for First: {np.mean(times)}\")" "print(f\"Average Time per Image for First: {np.mean(times)}\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 6,
"id": "f592fa32", "id": "4c05b947",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[4 5]\n",
"[4 5]\n"
]
}
],
"source": [ "source": [
"b = np.arange(9).reshape((3,3))\n", "new_image, new_pred, new_diff, no_ravel = plot_hist(images, 10)"
"print(b)\n",
"print(b[1,1::])\n",
"print(b[1,1:])"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 7,
"id": "dda442ae", "id": "dda442ae",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{
"ename": "NameError",
"evalue": "name 'difference' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_10808/722042198.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0max\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_subplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpredict\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mimage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdifference\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'o'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0malpha\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrcParams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'font.size'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'difference' is not defined"
]
},
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 720x720 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
}, },
"metadata": { "metadata": {
...@@ -245,96 +208,184 @@ ...@@ -245,96 +208,184 @@
} }
], ],
"source": [ "source": [
"fig = plt.figure(figsize = (10,10))\n", "new_error = np.abs(new_image-new_pred)\n",
"ax = fig.add_subplot()\n", "plt.hist(new_error, bins=20, density=True)\n",
"x = np.abs(predict-image)\n", "sns.kdeplot(new_error)\n",
"y = difference\n", "plt.xlabel(\"error\")\n",
"plt.plot(x,y,'o',alpha = 0.2)\n", "plt.show()\n"
"plt.rcParams.update({'font.size': 20})\n",
"plt.xlabel(\"differnece to the true value\" )\n",
"plt.ylabel(\"differnece of min and max of true value of the surroundings\")\n",
"plt.show()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"id": "58da6063", "id": "58da6063",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"image = Image.open(images[0]) #Open the image and read it as an Image object\n", "plt.hist(new_image, bins=25, density=True)\n",
"image = np.array(image)[1:,:]\n", "sns.kdeplot(new_image)\n",
"#z = np.array([image[1-1,1-1], image[1-1,1], image[1-1,1+1], image[1,1-1]])\n", "plt.xlabel(\"Actual Pixel Value\")\n",
"z = np.array([22554,22552,22519,22561])\n", "plt.show()"
"print(z)\n",
"'''A = np.array([[-3,0,1],[0,-3,3],[-1,-3,4]])\n",
"y = np.array([z[0]-z[2]+z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n",
"a,b,c = np.linalg.solve(A,y)'''\n",
"A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]])\n",
"y = np.array([-z[0]+z[2]-z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n",
"print(y)\n",
"a,b,c = np.linalg.solve(A,y)\n",
"print(a,b,c)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 79,
"id": "2562feeb", "id": "2562feeb",
"metadata": { "metadata": {
"scrolled": false "scrolled": false
}, },
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(512, 640)\n",
"1310832\n",
"9\n"
]
}
],
"source": [ "source": [
"i0 = (a*(-1) + b*(1) + c)\n", "f_r = no_ravel[0]\n",
"i1 = (a*(0) + b*(1) + c)\n", "print(no_ravel.shape)\n",
"i2 = (a*(1) + b*(1) + c)\n", "print(sys.getsizeof(no_ravel))\n",
"i3 = (a*(-1) + b*(0) + c)\n", "print((256).bit_length())"
"print(sum([(i0-z[0])**2,(i1-z[1])**2,(i2-z[2])**2,(i3-z[3])**2]))\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 99,
"id": "470cc137", "id": "470cc137",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(258, 322)\n"
]
},
{
"data": {
"text/plain": [
"'print(decompress)\\nprint(np.mean(np.abs(decompress-no_ravel)))'"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"a = 0\n", "coeffs = pywt.dwt2(no_ravel, 'bior1.3')\n",
"b = 2\n", "LL, (LH, HL, HH) = coeffs\n",
"c = 2\n", "print(HH.shape)\n",
"i0 = (a*(-1) + b*(1) + c)\n", "decompress = pywt.idwt2(coeffs, 'bior1.3')\n",
"i1 = (a*(0) + b*(1) + c)\n", "\"\"\"print(decompress)\n",
"i2 = (a*(1) + b*(1) + c)\n", "print(np.mean(np.abs(decompress-no_ravel)))\"\"\"\n"
"i3 = (a*(-1) + b*(0) + c)\n",
"print(sum([(i0-z[0])**2,(i1-z[1])**2,(i2-z[2])**2,(i3-z[3])**2]))\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 59,
"id": "3292b395", "id": "3292b395",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[72, 101, 108, 108, 111, 32, 109, 121, 32, 110, 97, 109, 101, 32, 105, 115, 32, 83, 99, 111, 117, 116]\n",
"256\n",
"71\n"
]
}
],
"source": [ "source": [
"#z = np.hstack((image[0,:3], image[1,0]))\n", "def compress(uncompressed):\n",
"#x = np.array([-1,0,1,-1])\n", " \"\"\"Compress a string to a list of output symbols.\"\"\"\n",
"#y = np.array([-1,-1,-1,0])\n", " \n",
"A = np.array([[-3,0,1],[0,-3,3],[1,3,-4]])\n", " # Build the dictionary.\n",
"#y = np.array([z[0]-z[2]+z[3], z[0]+z[1]+z[2], -z[0]-z[1]-z[2]-z[3]])\n", " dict_size = 256\n",
"y = np.array([[1,2,3],[4,5,6],[7,8,9]])\n", " dictionary = dict((chr(i), i) for i in range(dict_size))\n",
"print(np.linalg.solve(A,y))" " # in Python 3: dictionary = {chr(i): i for i in range(dict_size)}\n",
"\n",
" w = \"\"\n",
" result = []\n",
" for c in uncompressed:\n",
" wc = w + c\n",
" if wc in dictionary:\n",
" w = wc\n",
" else:\n",
" result.append(dictionary[w])\n",
" # Add wc to the dictionary.\n",
" dictionary[wc] = dict_size\n",
" dict_size += 1\n",
" w = c\n",
" \n",
" # Output the code for w.\n",
" if w:\n",
" result.append(dictionary[w])\n",
" return result\n",
"\n",
"store = compress(\"Hello my name is Scout\")\n",
"print(store)\n",
"print(sys.getsizeof(store))\n",
"print(sys.getsizeof(\"Hello my name is Scout\"))"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 88,
"id": "f9687830", "id": "f9687830",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.01910218596458435\n"
]
}
],
"source": [ "source": [
"0.5**2 + 1.5**2" "def wavelet(num_images, i): \n",
"\n",
" image = Image.open(num_images[i]) #Open the image and read it as an Image object\n",
" image = np.array(im)[1:,:]\n",
" coeffs = pywt.dwt2(image, 'bior1.3')\n",
" return coeffs\n",
"\n",
"def huffman(coeffs):\n",
" for i in range(len(coeffs)):\n",
" \n",
"\n",
"coef, t = wavelet(num_images)\n",
"\n",
"def wave_decompress(coeffs):\n",
" times = []\n",
" for i in range(len(coeffs)):\n",
" start = time()\n",
" decompress = pywt.idwt2(coeffs[i], 'bior1.3')\n",
" stop = time()\n",
" times.append(stop-start)\n",
" return times\n",
"ti = wave_decompress(coef)\n",
"print(np.mean(ti))"
] ]
}, },
{ {
...@@ -343,12 +394,7 @@ ...@@ -343,12 +394,7 @@
"id": "e98eed4b", "id": "e98eed4b",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": []
"y1= [0,1,2,3]\n",
"y2=[4,5,6,7]\n",
"y3=[8,9,10,11]\n",
"np.vstack((y1,y2,y3)).T"
]
}, },
{ {
"cell_type": "code", "cell_type": "code",
......
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