Skip to content
Advertisement

colors are wrong numpy array for pillow image when I use txt

firstly I am transforming an image into numpy array and writing it to a text file and this part is working

the problem is when i copy the txt content and dynamically paste it as vector and display the image. the colors are showing wrong.

enter image description here enter image description here

`

import cv2
import sys
import numpy
from PIL import Image

numpy.set_printoptions(threshold=sys.maxsize)

def img_to_txt_array(img):
    image = cv2.imread(img)
    # print(image)
    f = open("img_array.txt", "w")
    f.write(str(image))
    f.close()
    meuArquivo = open('img_array.txt', 'r')
    with open('img_array.txt', 'r') as fd:
        txt = fd.read()
        txt = txt.replace(" ", ",")
        txt = txt.replace('n',',n')
        txt = txt.replace("[,", "[")
        txt = txt.replace(',[', '[')
        txt = txt.replace(",,", ",")
        txt = txt.replace(',[', '[')
        txt = txt.replace("[,", "[")
        txt = txt.replace(",,", ",")

    with open('img_array.txt', 'w') as fd:
        fd.write(txt)
    with open('img_array.txt', 'r') as fr:
        lines = fr.readlines()
        with open('img_array.txt', 'w') as fw:
            for line in lines:
                if line.strip('n') != ',':
                    fw.write(line)

def show_imagem(array):
    # Create a NumPy array
    arry = numpy.array(array)
    
    # Create a PIL image from the NumPy array
    image = Image.fromarray(arry.astype('uint8'), 'RGB')
    
    # Save the image
    #image.save('image.jpg')
    
    # Show the image
    image.show(image)

array = [] #paste here the txt

img_to_txt_array('mickey.png')
show_imagem(array)

`

I need to get the colors right

Advertisement

Answer

Thing is, OpenCV reads images in BGR order, while PIL uses RGB order.

You may fix this at several points in your program (when reading, when saving, or when re-reading again).

For example, you can re-arrange the array, right after you read the image:

def img_to_txt_array(img):
    image = cv2.imread(img)
    image = image[:,:,::-1] ## ====> NEW. Reordering BGR to RGB

    ..... ## the rest of the function is the same 
    ..... ## (though there are other issues)

Also, rather than copy-paste the array, here is a function to read it directly from your .txt file (might NOT be optimal):

#array = [] #paste here the txt ## ==> not used anymore, see below
    
def load_array(f):
    with open(f) as data:
        ar_rows = data.readlines()
    ar_str = "".join(ar_rows)
    return eval(ar_str)
        

img_to_txt_array('mickey.png')
array = load_array('img_array.txt')
show_imagem(array)

I hope this helps.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement