Home > Software design >  plt.imshow() returns TypeError when run with certain images, but not with others
plt.imshow() returns TypeError when run with certain images, but not with others

Time:09-27

I'm writing an image optimisation algorythm (I know it's horribly inefficient, it's just my 1st attempt), and here's what I currently have. The directory of the project looks like this:

Directory

image_encoding.py takes an image and encodes it using the following logic:

if the pixel is new, it encodes its RGB value
else, it encodes the index of a pixel with the same color

If you need more insight, here's my code for image_encoding.py(it writes the encoded image into image_code.txt):

# imports

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# reading the image and displaying it

image = mpimg.imread('./100x150.jpg')
size = [image.shape[0], image.shape[1]]
print(f'size of the image: {size}')
plt.imshow(image)
plt.show()

# flattening the image for further processing

new_image = []

for imgline in image:
    for pixel in imgline:
        new_image.append(list(pixel))

image = new_image

# encodind the image

print('started encoding')

image_coding = []

# for a simple 2x2 image of a black square, image_coding will look like this:
# [ [ 255, 255, 255 ], 0, 0, 0 ]

i = 0

for pixel in image:

    i  = 1

    print(f'{str(i / len(image) * 100)[:5]}% done', end='\r')

    if pixel not in image_coding:
        image_coding.append(pixel)
    else:
        image_coding.append(image_coding.index(pixel))

# write the image coding into a file

print('writing image coding into image_code.txt')

f = open("image_code.txt", "w")
f.write(str(image_coding))
f.close()
f = open("image_code.txt", "a")
f.write(f'\n{size}')
f.close()

print('image successfully encoded into image_code.txt')

Then, the image_code.txt file will look like this:

[[67, 58, 41], [68, 59, 42], [70, 61, 44], [71, 62, 45], [72, 63, 46], 4, 4, 3, [75, 66, 49], 8, 8, 8, [73, 64, 47], 3, 2, [67, 60, 41], [66, 59, 40], [73, 68, 48], [82, 76, 60], [95, 89, 77], [113, 106, 100], [131, 123, 121], [137, 128, 133], [134, 124, 132], [125, 115, 126], [118, 108, 119], [105, 95, 104], [88, 78, 86], [77, 68, 73], [76, 67, 68], [85, 76, 77], [93, 88, 85], [86, 82, 79], [83, 82, 77], [77, 74, 69], [66, 63, 54], [61, 59, 47], [64, 62, 47], [66, 63, 48], [65, 62, 45], [78, 73, 54], [75, 70, 51], 41, [72, 67, 48], [70, 62, 49], [78, 70, 57], [82, 74, 63], [73, 65, 52], [76, 68, 55], [77, 70, 54], [77, 69, 56], 48, 48, [80, 72, 59], [86, 78, 67], [92, 84, 73], [89, 80, 71], [86, 77, 68], [81, 72, 63], [76, 67, 58], [71, 62, 55], [69, 60, 53], [67, 58, 51], [67, 59, 48], [68, 56, 42], [67, 56, 38], [65, 54, 36], [64, 53, 35], [66, 55, 37], [70, 59, 41], [75, 64, 46], [78, 67, 49], [79, 68, 50], 71, 71, [76, 65, 47], 70, [74, 63, 45], [73, 62, 44], 78, 3, 4, 12, 12, 2, 1, [66, 57, 40], [65, 56, 39], [62, 53, 36], [64, 55, 38], 89, 88, [59, 50, 33], [58, 49, 32], 93, 93, [57, 50, 31], 96, 96, [56, 49, 30], 1, [69, 60, 43], 3, 12, [74, 65, 48], 104, 104, 12, 104, 104, 104, 104, 12, 3, 101, [67, 60, 42], 16, [73, 68, 49], [83, 77, 63], [96, 89, 79], [115, 107, 104], [134, 125, 126], [143, 133, 141], [142, 132, 141], [140, 129, 143], [134, 123, 137], [121, 111, 122], [103, 93, 102], [90, 80, 88], [87, 78, 81], [93, 84, 87], [99, 93, 93], [95, 91, 90], [93, 92, 90], [89, 85, 82], [79, 76, 69], [73, 70, 61], [73, 71, 59], [73, 69, 57], [69, 66, 51], [78, 72, 56], [76, 70, 54], 140, [75, 69, 53], [71, 63, 50], 48, [79, 71, 60], 44, 48, 50, 45, 50, 48, [79, 71, 58], [84, 76, 65], [89, 81, 70], [90, 81, 72], [88, 79, 70], [84, 75, 66], [80, 71, 64], [76, 67, 60], [73, 64, 57], 60, [71, 61, 52], [72, 60, 46], 69, 65, 66, 66, [68, 57, 39], [71, 60, 42], 77, 70, 70, 77, 78, [72, 61, 43], 170, 69, [69, 58, 40], 3, 12, 104, 8, 4, 101, 87, [63, 54, 37], 88, 89, 86, 87, 88, 92, 93, 93, 96, 96, 96, 99, 101, 3, 12, 8, [76, 67, 50], [77, 68, 51], 204, 204, 8, 204, 204, 8, 104, 4, 2, [68, 61, 43], [64, 57, 41], [69, 63, 51], [79, 72, 62], [92, 85, 79], [111, 102, 103], [132, 123, 128], [146, 136, 147], [152, 141, 155], [158, 147, 164], [153, 142, 159], [140, 129, 145], [123, 112, 126], [107, 97, 108], [99, 89, 97], [100, 90, 98], [103, 97, 101], [103, 98, 102], [106, 101, 105], [104, 100, 101], [96, 92, 91], [92, 87, 84], [89, 84, 78], [84, 80, 71], [77, 73, 62], [81, 75, 63], [79, 73, 61], [82, 74, 61], 153, 144, 47, [76, 66, 54], [69, 59, 47], [74, 64, 52], [75, 65, 55], 249, 249, 249, [79, 69, 59], [85, 75, 66], [90, 80, 71], [93, 82, 76], [92, 81, 75], [91, 80, 74], [88, 77, 73], [84, 73, 69], [80, 69, 65], [77, 66, 62], [75, 65, 56], [76, 64, 50], 78, 179, 68, 67, 68, 169, 69, 176, 170, 69, 179, 169, 65, 68, 68, 4, 8, [78, 69, 52], [80, 71, 54], [79, 70, 53], 104, 0, 88, [60, 51, 34], 187, 0, 101, 87, [61, 52, 35], 92, 288, [58, 51, 32], 296, 96, 96, 2, 4, 104, 204, 282, 284, 284, 284, 205, 282, 282, 282, 204, 104, 4, [70, 63, 47], [63, 55, 42], [65, 58, 48], [70, 63, 55], [80, 72, 69], [98, 89, 92], [121, 111, 119], [142, 132, 143], [155, 144, 160], [167, 156, 173], [163, 152, 169], [154, 143, 160], [137, 126, 142], [119, 109, 120], [107, 97, 106], [103, 93, 101], [104, 94, 102], [106, 99, 106], [112, 107, 113], [115, 110, 116], [113, 108, 112], [111, 105, 107], [107, 101, 101], [99, 94, 91], [91, 86, 82], [90, 83, 77], [84, 77, 69], 158, 146, [69, 61, 48], 44, 248, [70, 60, 48], [70, 60, 50], 348, [72, 59, 50], 348, [73, 60, 51], [77, 67, 57], [88, 75, 67], [93, 83, 74], [97, 84, 78], [96, 85, 79], [97, 83, 80], [94, 83, 79], [93, 79, 76], [87, 76, 72], [85, 71, 68], [83, 70, 62], [79, 67, 53], 75, 176, 169, 68, 68, 169, 69, 170, 170, 69, 179, 65, 68, [251, 214, 185], [253, 217, 191], [255, 222, 196], [255, 224, 200], [255, 224, 199], [255, 222, 197], [251, 219, 196], [250, 218, 195], [255, 224, 203], 2857, [255, 227, 206], [255, 228, 207], [255, 228, 209], [254, 229, 209], [254, 227, 208], 2857, [247, 212, 182], [255, 226, 190], [255, 223, 187], [239, 205, 168], [243, 211, 173], [255, 234, 198], [245, 219, 186], [197, 172, 142], [59, 34, 12], 2433, 2468, [44, 24, 17], [62, 43, 37], [40, 22, 18], [37, 19, 17], [62, 49, 43], 823, 49, 2786, 2883, 2884, [87, 79, 68], 2985, [85, 76, 67], 158, [89, 80, 73], [95, 86, 79], [101, 92, 87], [104, 95, 90], [104, 94, 92], [102, 92, 90], [100, 91, 86], [87, 80, 70], [85, 79, 67], 240, 2798, 1714, [84, 78, 56], 1714, 1603, 1605, 1609, [70, 64, 42], 1609, 3006, 1609, 1708, 1605, [77, 71, 49], 1703, 3001, 1613, [89, 78, 58], [88, 77, 57], [76, 63, 46], 1971, [38, 21, 11], 2136, [43, 26, 18], [42, 23, 16], [53, 32, 27], [49, 26, 20], [26, 4, 0], 2532, [66, 40, 23], [134, 109, 89], [178, 154, 130], [197, 166, 137], [202, 157, 118], [216, 163, 121], [216, 164, 124], [216, 167, 127], [224, 176, 138], 2442, [227, 183, 148], [235, 191, 156], [239, 196, 162], [243, 202, 170], [249, 208, 176], [251, 211, 176], [251, 208, 174], [250, 207, 172], [254, 211, 176], [255, 216, 181], [251, 215, 183], [251, 216, 188], [253, 218, 190], 2851, [255, 222, 195], 3052, [253, 219, 194], [249, 217, 192], [253, 221, 198], [253, 223, 199], [254, 223, 202], [252, 224, 202], [252, 224, 203], [250, 223, 202], [250, 221, 203], [251, 220, 199], [241, 204, 177], [255, 227, 194], [255, 231, 194], [249, 214, 174], [239, 206, 163], [242, 210, 169], [245, 217, 177], [246, 220, 185], [156, 132, 104], [70, 48, 27], 2433, [35, 15, 8], [43, 24, 20], [26, 8, 8], [31, 12, 14], [53, 38, 35], [64, 54, 44], 47, 46, 46, 46, 2987, 57, [85, 76, 69], 2794, [87, 78, 73], [93, 84, 79], [99, 89, 87], 2993, [106, 96, 95], 3093, [106, 96, 94], [93, 86, 76], [89, 83, 71], [84, 78, 66], 241, 2601, 1602, 2602, 1803, 1690, 2193, 2189, 1907, 1990, 1606, 1690, 1297, 1715, 1296, 2580, 1694, [97, 89, 68], [79, 68, 48], [49, 38, 20], [28, 15, 0], [26, 12, 0], [39, 22, 12], [46, 29, 19], [45, 27, 17], [42, 20, 9], [43, 19, 7], [33, 7, 0], [55, 28, 9], [129, 98, 77], [184, 154, 128], [196, 165, 137], [201, 165, 133], [202, 154, 116], [217, 166, 123], [217, 168, 127], [214, 166, 126], [223, 177, 141], [232, 188, 153], [237, 194, 160], [243, 200, 166], [242, 201, 169], [243, 204, 173], [246, 207, 176], [249, 210, 179], [251, 210, 178], 3043, [250, 210, 175], [250, 209, 177], [250, 213, 184], [248, 211, 184], [247, 210, 184], [249, 213, 187], [252, 218, 193], [254, 220, 195], 3054, [251, 216, 194], [248, 216, 193], 3156, [249, 217, 196], [248, 217, 196], [248, 215, 196], [246, 213, 194], [244, 211, 192], [245, 210, 190], [252, 215, 188], [253, 214, 183], [246, 208, 172], [250, 212, 173], [255, 219, 175], [241, 207, 162], [235, 202, 159], [252, 220, 181], [255, 229, 195], [136, 109, 82], [48, 21, 2], [33, 9, 0], [28, 8, 1], [19, 1, 0], [33, 17, 17], [56, 41, 36], [65, 53, 41], [78, 66, 52], 2177, 2420, 146, 2317, [82, 73, 66], 159, 159, [84, 75, 68], 441, 2893, 2994, 3095, [108, 98, 96], [108, 99, 94], [95, 87, 76], [91, 83, 70], 2884, 153, 154, 242, 2515, 50, 2694, 2688, 1623, 47, [76, 68, 57], 48, 2886, 2884, 2886, 2278, 1621, 2182, [100, 90, 78], [50, 41, 26], [37, 27, 15], [45, 33, 21], [39, 27, 15], 1940, 1448, [30, 13, 0], 2264, [44, 20, 0], [76, 49, 20], [132, 101, 72], [179, 144, 114], [199, 163, 131], [208, 169, 138], [218, 175, 143], [217, 171, 137], [221, 176, 137], 3136, [222, 176, 140], [220, 176, 141], [224, 181, 146], [234, 191, 157], 3139, [235, 194, 162], [236, 195, 163], [236, 197, 166], [237, 198, 167], [240, 201, 170], [244, 205, 172], [247, 208, 175], [248, 209, 180], [249, 209, 184], [250, 209, 189], [251, 210, 190], [250, 212, 191], [251, 215, 193], [252, 217, 195], 2954, [252, 220, 199], [250, 218, 197], [251, 219, 198], 3257, [253, 218, 198], [252, 215, 196], [249, 211, 192], [246, 208, 189], [244, 206, 185], [244, 208, 182], [245, 210, 180], [246, 210, 178], [245, 205, 170], [241, 199, 161], [239, 196, 154], [242, 197, 155], [243, 200, 158], [255, 213, 175], [233, 195, 159], [144, 110, 82], [49, 23, 0], [28, 7, 0], [40, 24, 9], [42, 32, 22], [50, 38, 26], 749, [108, 91, 71], [111, 95, 79], [89, 77, 61], 1922, 2415, [78, 71, 61], [80, 73, 63], [77, 68, 59], 58, [87, 77, 67], [91, 81, 71], [94, 84, 75], [97, 87, 78], [102, 91, 85], [106, 96, 87], 2918, [98, 84, 71], [93, 79, 66], [87, 73, 60], 2317, 2317, 2317, [79, 70, 61], 3303, [78, 69, 60], 3288, 59, [75, 66, 57], 59, 158, 56, [91, 82, 73], [101, 92, 83], [105, 96, 87], [97, 88, 79], [57, 47, 37], [37, 27, 17], [44, 34, 24], [52, 42, 32], [46, 34, 22], [34, 22, 8], [30, 14, 0], [41, 25, 2], [55, 35, 10], [77, 54, 23], [121, 92, 58], [168, 135, 100], [199, 160, 127], [207, 167, 132], [211, 166, 135], [215, 170, 137], [216, 171, 138], 3236, [223, 179, 144], 3334, [222, 179, 144], [225, 182, 147], 3238, [242, 199, 165], 3240, 3240, [235, 196, 165], 3243, 3244, 3141, [245, 209, 177], [246, 209, 182], [247, 206, 184], [248, 207, 189], [249, 208, 190], 3261, [249, 214, 194], 3158, 3256, [250, 219, 198], 3063, 3255, 3255, [254, 219, 199], [254, 216, 197], [252, 214, 195], [253, 212, 194], 3251, [245, 211, 186], [243, 212, 184], [245, 210, 182], 3141, [241, 197, 162], [239, 194, 155], [242, 193, 153], [242, 195, 153], [246, 201, 160], [254, 212, 174], [216, 180, 146], [127, 98, 68], [56, 35, 8], [49, 32, 12], [62, 51, 33], [63, 50, 33], [97, 79, 57], [126, 105, 84], [127, 110, 90], [98, 85, 68], 1921, 1623, [77, 70, 60], 3287, 3303, 46, [89, 76, 67], 1317, 3291, 355, 3293, 1319, [97, 83, 70], [97, 81, 66], [92, 76, 61], [88, 72, 57], [77, 68, 61], [78, 69, 62], [81, 72, 65], 2794, 2794, 3186, 3402, 159, 3400, 3400, 3087, [93, 84, 77], [101, 92, 85], 724, [108, 99, 92], 157, 3317, [31, 21, 11], [36, 26, 16], [39, 29, 19], [48, 36, 24], [48, 36, 22], [45, 29, 13], [62, 46, 23], [86, 66, 41], [120, 97, 66], [165, 136, 104], [196, 163, 128], [209, 170, 137], [208, 167, 135], 3330, [213, 168, 135], 3332, [221, 177, 142], [226, 182, 147], 3038, [226, 183, 149], [228, 185, 151], 3238, 3040, [234, 193, 161], 3440, 3342, 3243, 3244, [244, 205, 174], [245, 208, 179], [247, 210, 183], [245, 207, 184], [245, 209, 187], [247, 211, 189], [248, 213, 191], 3156, [248, 218, 194], [248, 220, 196], [249, 221, 197], [250, 222, 198], 3455, [250, 220, 196], 2954, [253, 218, 196], [254, 218, 196], [255, 218, 197], [254, 219, 197], [247, 216, 195], [247, 217, 193], [245, 213, 188], [242, 207, 179], [239, 198, 166], [236, 193, 158], [235, 189, 153], [235, 190, 151], [243, 199, 160], [253, 213, 177], [252, 216, 182], [183, 152, 121], [78, 52, 25], [42, 22, 0], [63, 46, 26], [72, 55, 35], [111, 91, 67], [133, 113, 89], [133, 116, 96], [101, 88, 71], 248, 1623, 3286, [78, 71, 63], 3186, 2987, 2819, 2819, 834, [89, 78, 72], 258, [96, 83, 75], [95, 81, 68], 1973, [90, 77, 61], [87, 74, 58], 3400, [79, 70, 63], 2794, 2793, [87, 78, 71], 3087, 2794, 3402, 3402, 3402, 2793, 3411, [105, 96, 89], 725, 3414, 159, [35, 25, 16], 3419, 3419, [32, 22, 12], [45, 32, 23], [55, 43, 29], [59, 43, 27], 1052, [114, 94, 69], [146, 123, 92], [180, 151, 119], [195, 162, 129], [200, 161, 128], [204, 163, 131], [213, 168, 137], [216, 171, 140], [217, 172, 139], [222, 178, 143], [228, 184, 149], [231, 187, 152], [231, 188, 154], 3536, 3238, 3138, 3440, 3440, 3342, 3243, [241, 202, 171], [245, 206, 175], [246, 209, 180], 3149, [250, 214, 190], [249, 214, 192], 3155, 2955, [251, 221, 197], [251, 223, 199], [251, 225, 200], [252, 226, 201], [248, 222, 197], [247, 221, 196], [247, 219, 195], [249, 219, 195], 2954, 3056, [255, 223, 201], [255, 226, 205], 2958, [252, 225, 204], 3063, 3466, [240, 205, 175], [235, 196, 163], [231, 191, 156], [228, 188, 152], [243, 203, 167], [241, 203, 167], [249, 213, 179], [224, 191, 160], [147, 120, 91], [92, 66, 41], [91, 69, 45], [111, 89, 65], [112, 90, 66], [123, 103, 79], [121, 104, 84], [97, 84, 67], 246, 3303, [82, 75, 67], [75, 68, 60], [88, 79, 72], [90, 81, 74], [95, 82, 76], [94, 81, 75], [90, 79, 75], [89, 78, 74], [91, 80, 78], 256, 1230, [95, 82, 66], 1037, 3498, [79, 70, 65], 732, [85, 76, 71], [88, 79, 74], 3603, [86, 77, 72], [84, 75, 70], 732, 3089, 3089, 3603, 441, [102, 93, 88], [118, 109, 104], 629, 60, [32, 22, 13], [51, 41, 31], [60, 50, 41], 1824, [43, 30, 21], 2721, [63, 47, 32], [94, 77, 57], [125, 105, 80], [148, 124, 96], [172, 143, 111], [182, 149, 116], [192, 153, 120], [205, 164, 132], [217, 172, 143], [220, 175, 144], [220, 175, 142], [224, 180, 145], [230, 185, 152], [234, 189, 156], 3238, 3238, [235, 192, 160], [236, 193, 161], [234, 193, 163], [235, 194, 164], 3242, [238, 199, 168], [242, 203, 174], [247, 208, 179], [249, 212, 183], [250, 215, 187], 2953, 3057, [254, 224, 200], [253, 225, 201], [254, 226, 202], [254, 228, 203], 3653, [254, 230, 204], [249, 225, 199], [249, 223, 198], 3657, 3456, 2863, [255, 227, 203], [255, 229, 206], [255, 231, 210], [255, 235, 216], [255, 233, 216], 2960, [250, 222, 200], [246, 214, 189], [239, 205, 177], [233, 198, 168], [229, 193, 161], [230, 194, 160], [236, 200, 166], [240, 205, 173], [246, 213, 180], [227, 196, 167], [168, 139, 109], [121, 91, 63], [116, 90, 63], [108, 84, 58], [111, 91, 66], [115, 98, 78], 3483, [80, 70, 58], 2317, [85, 78, 70], [77, 70, 64], 630, [96, 87, 82], [101, 87, 84], [100, 86, 83], [96, 85, 83], [95, 83, 83], [97, 85, 87], [99, 88, 86], [99, 86, 77], [97, 85, 71], 1321, 1428, [81, 72, 67], 3186, 3602, 3504, 3089, 3504, 3602, 3189, [91, 82, 77], 3411, 3708, 3504, [95, 86, 81], 724, 2893, [60, 51, 44], [47, 37, 28], [55, 45, 35], [58, 48, 39], [40, 30, 21], [37, 24, 15], 2721, 1350, [97, 80, 60], [118, 98, 74], [138, 114, 86], [161, 132, 100], [177, 144, 111], [195, 156, 125], [210, 169, 137], [221, 176, 147], [222, 177, 146], [224, 179, 146], 3038, [231, 186, 153], [235, 190, 157], [236, 193, 159], 3138, [237, 194, 162], 3738, 3641, [236, 195, 165], 3243, 3244, [245, 206, 177], [249, 210, 181], 2948, 3050, 2952, [255, 225, 201], 3749, 3651, 3651, 3555, 3555, 3555, 3554, 3554, 3555, 3652, 2755, [255, 231, 207], [255, 233, 209], [255, 233, 212], [255, 235, 218], 3665, [255, 230, 211], 2958, [251, 223, 201], [247, 217, 191], [241, 210, 182], [236, 205, 176], [221, 188, 157], [238, 205, 174], [232, 199, 168], [234, 201, 170], [249, 216, 185], [214, 181, 150], [143, 110, 79], [102, 73, 43], [103, 79, 51], [103, 83, 58], [118, 101, 81], 964, [87, 77, 65], 3288, 341, [82, 75, 69], [96, 86, 84], 3091, [104, 90, 89], [105, 91, 91], [102, 90, 90], [103, 91, 93], [105, 93, 97], [108, 96, 98], [106, 93, 87], 1419, [100, 87, 78], 1318, 3501, 2317, 3186, 158, 2793, 157, 2989, 56, 3589, [96, 87, 78], [96, 87, 80], 57, 2989, [103, 94, 85], 3504, [48, 39, 30], [52, 42, 33], [42, 32, 23], [43, 32, 26], [33, 23, 14], [33, 20, 11], 2777, [76, 60, 45], [93, 76, 56], [107, 87, 63], [128, 104, 76], [155, 126, 96], 3727, [197, 158, 127], [210, 169, 139], [222, 177, 148], [227, 182, 151], [228, 183, 150], [229, 184, 151], [232, 187, 154], 3735, 3639, [238, 195, 163], 2456, 2456, 2457, [238, 197, 167], [239, 200, 171], 3644, [247, 207, 181], [252, 212, 186], [254, 217, 190], [255, 220, 192], 2953, [253, 221, 196], [252, 220, 195], [250, 220, 194], [249, 219, 193], [245, 218, 191], [244, 217, 190], 3854, [248, 221, 194], [249, 222, 195], [251, 224, 197], 2656, 2660, [255, 228, 203], 3861, 2758, [255, 225, 207], [253, 224, 208], [254, 225, 207], [255, 227, 209], [255, 230, 209], [255, 228, 206], 3553, [247, 220, 193], [235, 205, 177], [239, 210, 180], [232, 201, 172], 3774, [250, 217, 186], 3265, [189, 154, 124], [124, 93, 64], [99, 73, 46], [91, 71, 46], [114, 98, 75], [126, 113, 96], 2079, 2317, [84, 77, 71], [85, 77, 74], [94, 84, 83], [97, 87, 86], [104, 90, 90], [107, 92, 95], [106, 94, 98], [108, 95, 102], [112, 99, 108], [116, 103, 110], [116, 105, 103], [114, 103, 99], [111, 100, 96], [108, 97, 93], 2693, 2693, 146, 46, 2790, 155, 55, 1684, [88, 80, 69], 729, [99, 91, 80], 2985, 54, 729, 2515, [40, 32, 21], [27, 17, 8], [25, 15, 6], [46, 35, 29], [45, 34, 28], 1744, 3279, 1349, [87, 70, 52], [102, 82, 58], [123, 99, 71], [152, 123, 93], [176, 143, 112], [193, 154, 123], [206, 165, 135], 3830, [232, 187, 158], [231, 186, 155], 3734, 3834, 3635, 3639, [239, 196, 164], [239, 195, 166], 3938, 3841, [239, 198, 168], [240, 201, 172], [243, 204, 175], [248, 208, 182], [253, 213, 187], [255, 219, 192], [255, 221, 195], [253, 217, 193], [251, 217, 192], [249, 215, 190], [247, 213, 188], 3364, [241, 209, 184], [242, 208, 183], [239, 207, 182], [246, 212, 187], 3668, 3152, 2854, 2953, [255, 223, 198], 2953, [255, 220, 198], [250, 215, 196], [248, 215, 198], [251, 220, 200], [255, 226, 206], 3763, [255, 236, 213], [255, 233, 210], [255, 229, 204], [254, 228, 201], [235, 208, 179], [234, 204, 176], [242, 211, 182], [248, 214, 186], [249, 214, 184], [206, 169, 140], [130, 96, 68], [95, 69, 42], [79, 59, 34], [103, 87, 64], [128, 115, 96], [107, 97, 85], 2889, [87, 80, 74], [83, 75, 72], [91, 81, 80], [95, 85, 84], [103, 88, 91], 3891, 3893, [111, 98, 105], [116, 103, 113], [120, 107, 116], [127, 115, 119], [125, 113, 113], [122, 110, 112], [120, 108, 108], 50, 48, 48, 50, 153, 2883, 730, 1820, [88, 80, 67], [99, 91, 78], 2278, [84, 76, 63], [95, 87, 74], [96, 88, 75], [67, 59, 46], [34, 26, 13], [29, 19, 10], [39, 28, 22], [40, 29, 23], 4017, [47, 34, 26], [51, 38, 29], [60, 44, 31], [73, 56, 38], [96, 76, 52], [118, 94, 68], 2261, [163, 130, 99], [191, 152, 121], [219, 178, 148], [231, 185, 159], [225, 180, 151], [228, 183, 152], [230, 185, 154], [234, 189, 158], [235, 190, 159], [234, 190, 161], [235, 191, 162], 2456, [240, 196, 167], [239, 198, 170], [241, 200, 172], [243, 203, 177], [250, 210, 184], [255, 216, 190], 2850, [255, 218, 192], [252, 215, 189], [249, 211, 188], [250, 212, 189], 4048, 3448, [240, 202, 179], [237, 199, 176], [239, 198, 176], [238, 200, 177], [245, 204, 182], 3448, [250, 209, 187], [248, 210, 187], [247, 209, 186], 4060, 4049, [252, 214, 191], [247, 209, 188], 3263, [243, 206, 187], [247, 215, 194], 2958, [255, 237, 215], [255, 242, 219], [255, 242, 216], 4071, [255, 236, 209], 3871, 3974, [234, 200, 173], 3050, [236, 199, 172], [158, 124, 96], [96, 70, 43], [68, 48, 23], [78, 62, 39], [121, 108, 89], 826, 3305, 219, 3887, [88, 78, 77], [93, 83, 82], [102, 87, 90], [105, 90, 93], [106, 93, 100], [113, 100, 107], [125, 112, 122], [135, 122, 132], [138, 127, 135], 637, [148, 137, 145], 636, 2085, 2085, 49, 49, 2277, 2502, 2378, [87, 80, 64], 2378, 2280, 4107, 2184, [92, 85, 69], [89, 82, 66], [61, 54, 38], 4015, 4016, [38, 27, 21], 4018, 4018, [48, 35, 29], [49, 36, 27], [55, 39, 26], [65, 48, 30], [98, 77, 56], [117, 93, 67], [141, 111, 83], [164, 130, 102], [192, 153, 124], [217, 176, 146], [229, 183, 157], [226, 180, 154], 3830, [223, 178, 147], [226, 181, 150], 3932, 4037, 3938, [243, 199, 170], [244, 200, 171], [238, 197, 169], [240, 199, 171], [245, 205, 179], [251, 211, 185], [255, 215, 189], 4044, [253, 216, 190], 2849, [255, 214, 192], [254, 212, 190], [250, 208, 186], [244, 202, 180], [240, 195, 174], [236, 191, 170], [235, 190, 169], 4154, [239, 194, 173], [241, 196, 175], [243, 198, 177], 4158, [240, 198, 176], 4160, [243, 201, 179], [246, 204, 182], [244, 199, 176], [244, 202, 178], [246, 205, 183], [247, 211, 187], 3950, [248, 218, 192], [245, 219, 194], [243, 219, 193], [236, 212, 186], [246, 220, 195], [254, 227, 200], 3851, [233, 201, 176], [236, 202, 175], [232, 196, 170], [187, 153, 126], [105, 79, 52], [70, 50, 25], [67, 51, 28], [105, 92, 75], [117, 107, 95], 157, [95, 88, 82], [86, 78, 75], [90, 80, 79], 3889, [106, 92, 92], [109, 94, 97], [108, 96, 100], [115, 102, 109], [127, 114, 123], [137, 124, 134], [145, 133, 145], [154, 144, 155], [161, 149, 161], [157, 147, 158], 2303, 2303, 2277, 2277, 2303, 2501, 2184, 2784, 2184, [86, 79, 63], 2502, 2502, [88, 81, 65], 2085, [52, 45, 29], [35, 27, 14], [34, 24, 15], [42, 31, 25], [43, 32, 28], [41, 30, 24], [45, 32, 26], [44, 31, 23], 2674, [66, 49, 31], [96, 75, 54], [112, 88, 62], [138, 108, 80], [166, 132, 104], [195, 156, 127], [214, 173, 145], [225, 179, 155], [225, 179, 153], [227, 182, 153]]
[150, 100]

As you can see, it has both integer and list values. Then, I pass the file into my image_decoding.py script. Here's how it looks:

# imports

import matplotlib.pyplot as plt

# decoding

f = open("image_code.txt", "r")
Lines = f.readlines()
size = Lines[1].strip('][').split(', ')
image_coding = Lines[0][:-2].strip('][').split(', ')
size[0], size[1] = int(size[0]), int(size[1])
f.close()

print('started reshaping the list')

for i in range(len(image_coding)):
    try:
        value = image_coding[i]
        if value[0] == '[':
            image_coding[i] = [int(image_coding[i][1:]), int(
                image_coding[i   1]), int(image_coding[i   2][:-1])]
        if i != 0 and type(image_coding[i - 1]) != list and type(image_coding[i]) != list:
            try:
                image_coding[i] = int(image_coding[i])
            except ValueError:
                pass

    except IndexError:
        break

counter = 1

for j in image_coding:
    if type(j) != int and j[-1] == ']':
        image_coding.remove(j)

    print(
        f'Stage 1: {counter} / {len(image_coding)} ({str(counter / len(image_coding) * 100)[:7]}%) done', end='\r')
    counter  = 1

counter = 1

for l in image_coding:
    if type(l) == str:
        image_coding.remove(l)

    print(
        f'Stage 2: {counter} / {len(image_coding)} ({str(counter / len(image_coding) * 100)[:7]}%) done', end='\r')
    counter  = 1

print('started decoding')

i = 0

image = []

for pixel in image_coding:

    i  = 1

    print(f'Decoding: {str(i / len(image_coding) * 100)[:7]}% done', end='\r')

    if type(pixel) == list:
        image.append(pixel)
    else:
        image.append(image_coding[pixel])

# unflattening the image to display it correctly

print('\nstarted unflattening')

new_image = []

for i in range(size[0]):
    imageline = []
    for j in range(size[1]):
        imageline.append(image[i*size[1]   j])
    new_image.append(imageline)

image = new_image

plt.imshow(image)
plt.show()

When running the script on the 50x100.jpg image (which looks like this):

50x100 image

The code works flawlessly. However, when I try to run it with the 100x100.jpg image, 100x150.jpg image or 300x200.jpg image, which look like this:

100x100 image

100x150 image

300x200 image

image_decoding.py returns the following TypeError:

Traceback (most recent call last):
  File "c:\Users\pc\Desktop\Programming\imageCoding\image_decoding.py", line 82, in <module>
    plt.imshow(image)
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_api\deprecation.py", line 454, in wrapper        
    return func(*args, **kwargs)
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\pyplot.py", line 2611, in imshow
    __ret = gca().imshow(
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_api\deprecation.py", line 454, in wrapper        
    return func(*args, **kwargs)
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\__init__.py", line 1423, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\axes\_axes.py", line 5572, in imshow
    im.set_data(X)
  File "C:\Users\pc\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\image.py", line 701, in set_data
    raise TypeError("Image data of dtype {} cannot be converted to "
TypeError: Image data of dtype object cannot be converted to float

P. S. There might be some really stupid bug in the code (e.g. missing bracket), I'm still quite new to this :)

CodePudding user response:

It's quite a lot of code you have there... I hope my answer is clear without reposting everything :)

Your bug is in the file reading and parsing (recreating the original data-types etc.), so I have the following suggestion for you.

Python comes with a package called pickle that you can use to store python objects and read them back into memory.

I'd suggest the following changes to your code.

In image_encoding.py replace

f = open("image_code.txt", "w")
f.write(str(image_coding))
f.close()
f = open("image_code.txt", "a")
f.write(f'\n{size}')
f.close()

with

import pickle  # put that at the top of your file
with open("image_code.txt", "wb") as file:
    pickle.dump({"image_coding": image_coding, "size": size}, file)

And then in image_decoding.py instead of

f = open("image_code.txt", "r")
Lines = f.readlines()
size = Lines[1].strip('][').split(', ')
image_coding = Lines[0][:-2].strip('][').split(', ')
size[0], size[1] = int(size[0]), int(size[1])
f.close()

print('started reshaping the list')

for i in range(len(image_coding)):
    try:
        value = image_coding[i]
        if value[0] == '[':
            image_coding[i] = [int(image_coding[i][1:]), int(
                image_coding[i   1]), int(image_coding[i   2][:-1])]
        if i != 0 and type(image_coding[i - 1]) != list and type(image_coding[i]) != list:
            try:
                image_coding[i] = int(image_coding[i])
            except ValueError:
                pass

    except IndexError:
        break

you can use:

import pickle
with open("test_data/image_code.txt", "rb") as file:
    data = pickle.load(file)
size = data.get("size")
image_coding = data.get("image_coding")

and have your original variables back without checking for "[" and casting back to integers etc.

Hope that helps. If you have any question, dont hesitate to ask.

  • Related