Commit cfb96985 authored by Bryce Hepner's avatar Bryce Hepner

Mathematical changes and testing

parent 9b1db8a3
from turtle import color
from WorkingPyDemo import * from WorkingPyDemo import *
def produce_error_array(encoded_string, list_dic, bins, use_diff): def produce_error_array(encoded_string, list_dic, bins, use_diff):
""" """
...@@ -88,17 +87,18 @@ def color_adjust(visual_array): ...@@ -88,17 +87,18 @@ def color_adjust(visual_array):
adjusted_array = visual_array - min_of_errors adjusted_array = visual_array - min_of_errors
adjusted_array = np.round(adjusted_array*255/np.max(adjusted_array)) adjusted_array = np.round(adjusted_array*255/np.max(adjusted_array))
return adjusted_array return adjusted_array
scenes = file_extractor(folder_name) if __name__ == "__main__":
images = image_extractor(scenes) scenes = file_extractor(folder_name)
list_dic = np.load("first_dic.npy", allow_pickle="TRUE") images = image_extractor(scenes)
bins = [21,32,48] list_dic = np.load("first_dic.npy", allow_pickle="TRUE")
encoded_string2 = bytes_to_bitstring(read_from_file(images[250][:-5] + "_Compressed.txt")) bins = [21,32,48]
original_array, error_array = produce_error_array(encoded_string2, list_dic, bins, False) encoded_string2 = bytes_to_bitstring(read_from_file(images[1][:-5] + "_Compressed.txt"))
adjusted_errors = color_adjust(abs(error_array)) original_array, error_array = produce_error_array(encoded_string2, list_dic, bins, False)
original_array_adjusted = color_adjust(original_array) adjusted_errors = color_adjust(abs(error_array))
# print(adjusted_errors) original_array_adjusted = color_adjust(original_array)
plt.subplot(121) # print(adjusted_errors)
plt.imshow(original_array_adjusted,cmap='gray',vmin = 0, vmax=255) plt.subplot(121)
plt.subplot(122) plt.imshow(original_array_adjusted,cmap='gray',vmin = 0, vmax=255)
plt.imshow(adjusted_errors,cmap = 'gray', vmin = 0, vmax=255) plt.subplot(122)
plt.show() plt.imshow(adjusted_errors,cmap = 'gray', vmin = 0, vmax=255)
\ No newline at end of file plt.show()
\ No newline at end of file
from matplotlib.image import composite_images
from WorkingPyDemo import *
def remove_noise(images, which_sensor):
same_sensor_images = []
which_sensor = str(which_sensor)
average_image = np.zeros_like(np.array(Image.open(images[0]))[1:])
for i, image_name in enumerate(images):
if int(which_sensor) > 9:
if image_name[-7:-5] == which_sensor:
same_sensor_images.append(image_name)
else:
if image_name[-7:-5] == "_" + which_sensor:
same_sensor_images.append(image_name)
for i, image_name in enumerate(same_sensor_images):
# print(image_name)
image_object = Image.open(image_name)
# print(np.array(image_object).shape)
# print(np.array(image_object)[1:] + average_image)
average_image = np.array(image_object)[1:] + average_image
return average_image/len(same_sensor_images)
scenes = file_extractor(folder_name)
images = image_extractor(scenes)
average_image = remove_noise(images,"7")
def color_adjust(visual_array):
min_of_errors = np.min(visual_array)
adjusted_array = visual_array - min_of_errors
adjusted_array = np.round(adjusted_array*255/np.max(adjusted_array))
return adjusted_array
print(np.max(average_image))
print(np.min(average_image))
plt.imshow(color_adjust(average_image),cmap='gray',vmin = 0, vmax=255)
plt.show()
# print(np.linalg.inv(np.array([[3,0,-1],[0,3,3],[1,-3,-4]])))
print(np.linalg.pinv(np.array([[-1,-1,1], [-1,0,1], [-1,1,1], [0,-1,1]])))
\ No newline at end of file
...@@ -76,7 +76,8 @@ def predict_pix(tiff_image_path, difference = True): ...@@ -76,7 +76,8 @@ def predict_pix(tiff_image_path, difference = True):
image_obj = Image.open(tiff_image_path) #Open the image and read it as an Image object image_obj = Image.open(tiff_image_path) #Open the image and read it as an Image object
image_array = np.array(image_obj)[1:,:].astype(int) #Convert to an array, leaving out the first row because the first row is just housekeeping data image_array = np.array(image_obj)[1:,:].astype(int) #Convert to an array, leaving out the first row because the first row is just housekeeping data
# image_array = image_array.astype(int) # image_array = image_array.astype(int)
A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation # A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation
Ainv = np.array([[0.5,-0.5,-0.5],[-0.5,1.83333333,1.5],[0.5,-1.5,-1.5]])
# where z0 = (-1,1), z1 = (0,1), z2 = (1,1), z3 = (-1,0) # where z0 = (-1,1), z1 = (0,1), z2 = (1,1), z3 = (-1,0)
z0 = image_array[0:-2,0:-2] # get all the first pixel for the entire image z0 = image_array[0:-2,0:-2] # get all the first pixel for the entire image
z1 = image_array[0:-2,1:-1] # get all the second pixel for the entire image z1 = image_array[0:-2,1:-1] # get all the second pixel for the entire image
...@@ -91,8 +92,8 @@ def predict_pix(tiff_image_path, difference = True): ...@@ -91,8 +92,8 @@ def predict_pix(tiff_image_path, difference = True):
# use numpy solver to solve the system of equations all at once # use numpy solver to solve the system of equations all at once
#predict = np.floor(np.linalg.solve(A,y)[-1]) #predict = np.floor(np.linalg.solve(A,y)[-1])
predict = np.round(np.round((np.linalg.solve(A,y)[-1]),1)) # predict = np.round(np.round((np.linalg.solve(A,y)[-1]),1))
predict = np.round(np.round((Ainv[-1]@y)),1)
#Matrix system of points that will be used to solve the least squares fitting hyperplane #Matrix system of points that will be used to solve the least squares fitting hyperplane
points = np.array([[-1,-1,1], [-1,0,1], [-1,1,1], [0,-1,1]]) points = np.array([[-1,-1,1], [-1,0,1], [-1,1,1], [0,-1,1]])
...@@ -113,7 +114,12 @@ def predict_pix(tiff_image_path, difference = True): ...@@ -113,7 +114,12 @@ def predict_pix(tiff_image_path, difference = True):
#points to the hyperplane), it is a measure of gradient #points to the hyperplane), it is a measure of gradient
f, diff, rank, s = la.lstsq(points, neighbor.T, rcond=None) f, diff, rank, s = la.lstsq(points, neighbor.T, rcond=None)
diff = diff.astype(int) diff = diff.astype(int)
# Pinv = np.linalg.pinv(points)
# b = [z0,z1,z2,z3]
# x = Pinv@np.array(b)
# diff = np.linalg.norm(b - points@x,ord=2)
# diff = diff.astype(int)
# calculate the error # calculate the error
error = np.ravel(image_array[1:-1,1:-1])-predict error = np.ravel(image_array[1:-1,1:-1])-predict
...@@ -402,6 +408,7 @@ def decoder(encoded_string, list_dic, bins, use_diff): ...@@ -402,6 +408,7 @@ def decoder(encoded_string, list_dic, bins, use_diff):
decode_matrix (512, 640): decoded matrix decode_matrix (512, 640): decoded matrix
""" """
A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation A = np.array([[3,0,-1],[0,3,3],[1,-3,-4]]) # the matrix for system of equation
Ainv = np.array([[0.5,-0.5,-0.5],[-0.5,1.83333333,1.5],[0.5,-1.5,-1.5]])
# change the dictionary back to list # change the dictionary back to list
# !!!!!WARNING!!!! has to change this part, everytime you change the number of bins # !!!!!WARNING!!!! has to change this part, everytime you change the number of bins
the_keys0 = list(list_dic[0].keys()) the_keys0 = list(list_dic[0].keys())
...@@ -421,7 +428,7 @@ def decoder(encoded_string, list_dic, bins, use_diff): ...@@ -421,7 +428,7 @@ def decoder(encoded_string, list_dic, bins, use_diff):
#Matrix system of points that will be used to solve the least squares fitting hyperplane #Matrix system of points that will be used to solve the least squares fitting hyperplane
points = np.array([[-1,-1,1], [-1,0,1], [-1,1,1], [0,-1,1]]) points = np.array([[-1,-1,1], [-1,0,1], [-1,1,1], [0,-1,1]])
# Pinv = np.linalg.pinv(points)
decode_matrix = np.zeros((512,640)) decode_matrix = np.zeros((512,640))
# loop through all the element in the matrix # loop through all the element in the matrix
for i in range(decode_matrix.shape[0]): for i in range(decode_matrix.shape[0]):
...@@ -449,11 +456,14 @@ def decoder(encoded_string, list_dic, bins, use_diff): ...@@ -449,11 +456,14 @@ def decoder(encoded_string, list_dic, bins, use_diff):
if use_diff: if use_diff:
difference = max(z0,z1,z2,z3) - min(z0,z1,z2,z3) difference = max(z0,z1,z2,z3) - min(z0,z1,z2,z3)
else: else:
# b = [z0,z1,z2,z3]
# x = Pinv@np.array(b)
# difference = np.linalg.norm(b - points@x,ord=2)
f, difference, rank, s = la.lstsq(points, [z0,z1,z2,z3], rcond=None) f, difference, rank, s = la.lstsq(points, [z0,z1,z2,z3], rcond=None)
difference = difference.astype(int) difference = difference.astype(int)
predict = np.round(np.round(np.linalg.solve(A,y)[-1][0],1)) # predict = np.round(np.round(np.linalg.solve(A,y)[-1][0],1))
predict = np.round(np.round((Ainv[-1]@y)[0],1))
# add on the difference by searching the dictionary # add on the difference by searching the dictionary
# !!!!!WARNING!!!! has to change this part, eveytime you change the number of bins # !!!!!WARNING!!!! has to change this part, eveytime you change the number of bins
if difference <= bins[0]: if difference <= bins[0]:
...@@ -501,19 +511,19 @@ def text_to_tiff(filename, list_dic, bins): ...@@ -501,19 +511,19 @@ def text_to_tiff(filename, list_dic, bins):
reconstruct_image = reconstruct_image.astype(np.uint16) reconstruct_image = reconstruct_image.astype(np.uint16)
reconstruct_image = Image.fromarray(reconstruct_image) reconstruct_image = Image.fromarray(reconstruct_image)
reconstruct_image.save(filename[:-16]+"_reconstructed.tiff", "TIFF") reconstruct_image.save(filename[:-16]+"_reconstructed.tiff", "TIFF")
# starttime = time()
if __name__ == "__main__": if __name__ == "__main__":
scenes = file_extractor(folder_name) scenes = file_extractor(folder_name)
images = image_extractor(scenes) images = image_extractor(scenes)
newnamesforlater = [] newnamesforlater = []
# list_dic, bins = make_dictionary(images, 4, False) # list_dic, bins = make_dictionary(images[0:1], 4, False)
file_sizes_new = [] file_sizes_new = []
file_sizes_old = [] file_sizes_old = []
list_dic = np.load("first_dic.npy", allow_pickle="TRUE") list_dic = np.load("first_dic.npy", allow_pickle="TRUE")
bins = [21,32,48] bins = [21,32,48]
# np.save("first_dic.npy", list_dic) # np.save("first_dic.npy", list_dic)
for i in range(len(images)): for i in range(len(images[0:5])):
# image, new_error, diff = huffman(images[i], 4, False) # image, new_error, diff = huffman(images[i], 4, False)
# encoded_string = encoder(new_error, list_dic, diff, bins) # encoded_string = encoder(new_error, list_dic, diff, bins)
# inletters = bitstring_to_bytes(encoded_string) # inletters = bitstring_to_bytes(encoded_string)
...@@ -535,18 +545,21 @@ if __name__ == "__main__": ...@@ -535,18 +545,21 @@ if __name__ == "__main__":
file_sizes_new.append(os.path.getsize("first_dic.npy")) file_sizes_new.append(os.path.getsize("first_dic.npy"))
print(np.sum(file_sizes_new)/np.sum(file_sizes_old)) print(np.sum(file_sizes_new)/np.sum(file_sizes_old))
list_dic = np.load("first_dic.npy", allow_pickle="TRUE") # list_dic = np.load("first_dic.npy", allow_pickle="TRUE")
bins = [21,32,48] bins = [21,32,48]
# starttime = time()
for i,item in enumerate(newnamesforlater[0:5]): for i,item in enumerate(newnamesforlater):
print(item) print(item)
image, new_error, diff = huffman(images[i], 4, False) image, new_error, diff = huffman(images[i], 4, False)
encoded_string2 = bytes_to_bitstring(read_from_file(item)) encoded_string2 = bytes_to_bitstring(read_from_file(item))
starttime = time()
reconstruct_image = decoder(encoded_string2, list_dic, bins, False) reconstruct_image = decoder(encoded_string2, list_dic, bins, False)
print(np.allclose(image, reconstruct_image)) print(np.allclose(image, reconstruct_image))
print(time() - starttime)
# text_to_tiff("images/1626033496_437803/1626033496_437803_3._Compressed.txt", list_dic, bins) # text_to_tiff("images/1626033496_437803/1626033496_437803_3._Compressed.txt", list_dic, bins)
# original_image = Image.open("images/1626033496_437803/1626033496_437803_3.tiff") # original_image = Image.open("images/1626033496_437803/1626033496_437803_3.tiff")
# original_image = np.array(original_image)[1:] # original_image = np.array(original_image)[1:]
# secondimage = Image.open("images/1626033496_437803/1626033496_437803_3_reconstructed.tiff") # secondimage = Image.open("images/1626033496_437803/1626033496_437803_3_reconstructed.tiff")
# secondimage = np.array(secondimage) # secondimage = np.array(secondimage)
# print(np.allclose(original_image, secondimage)) # print(np.allclose(original_image, secondimage))
\ No newline at end of file
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