Как преобразовать CSV-файл (16-битный (высокий) цвет) в изображение на Python? - PullRequest
0 голосов
/ 26 августа 2018

Контекст: Я построил небольшую тепловую камеру, которая может сохранять 70x70 пикселей на SD-карту.Эти пиксели имеют значение цвета в диапазоне от 0 до 2 ^ 16.(На самом деле определенные цвета, такие как черный (значение 0), никогда не отображаются).Этот цвет определяется как объяснено здесь: c ++ определил 16-битный (высокий) цвет

Я хочу преобразовать эти данные в изображение на моем компьютере с использованием Python.

ПримерСобранный из другого вопроса, к сожалению, не дает удовлетворительных результатов: плохое изображение

Как видите, изображение выглядит не очень хорошо.Мой экран показывает что-то вроде этого (обратите внимание, что эти два примера не были захвачены одновременно): photo

Белая рамка не является частью csv-файла.

Это код, который я использовал для создания изображения: я экспериментировал со значением color_max, но не получил хороших результатов.

#Python CSV to Image converter
#pip2 install cImage
#pip2 install numpy

from PIL import Image, ImageDraw
from numpy import genfromtxt

color_max = 256
#original 256

g = open('IMAGE_25.TXT','r')
temp = genfromtxt(g, delimiter = ',')
im = Image.fromarray(temp).convert('RGB')
pix = im.load()
rows, cols = im.size
for x in range(cols):
    for y in range(rows):
        #print str(x) + " " + str(y)
        pix[x,y] = (int(temp[y,x] // color_max // color_max % color_max),int(temp[y,x] // color_max  % color_max),int(temp[y,x] % color_max))
im.save(g.name[0:-4] + '.jpeg')

Это csv-файл: Данные изображения

31 обозначают синий в этом случае, высокие значения более красные.

Спасибо за любую помощь!


Вот некоторая дополнительная информация о моемпроект:

Тепловая камера Arduino с поддержкой SD-карты и возможностью сохранения изображения с использованием датчика тепловизора AMG8833 производства Panasonic: Лист данных

GitHub (Arduino и PythonКод)

Используемый мной чехол для 3D-печати и оригинальный код Arduino

Схема с добавленной SD-картой

1 Ответ

0 голосов
/ 27 августа 2018

Я думаю, это должно выглядеть так:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Read 16-bit RGB565 image into array of uint16
with open('IMAGE_25.TXT','r') as f:
    rgb565array = np.genfromtxt(f, delimiter = ',').astype(np.uint16)

# Pick up image dimensions
h, w = rgb565array.shape

# Make a numpy array of matching shape, but allowing for 8-bit/channel for R, G and B
rgb888array = np.zeros([h,w,3], dtype=np.uint8)

for row in range(h):
    for col in range(w):
        # Pick up rgb565 value and split into rgb888
        rgb565 = rgb565array[row,col]
        r = ((rgb565 >> 11 ) & 0x1f ) << 3
        g = ((rgb565 >> 5  ) & 0x3f ) << 2
        b = ((rgb565       ) & 0x1f ) << 3
        # Populate result array
        rgb888array[row,col]=r,g,b

# Save result as PNG
Image.fromarray(rgb888array).save('result.png')

enter image description here

Ключевые слова: Python, numpy, изображение, изображениеобработка, тепловизионная камера, Panasonic, AMG8833, RGB565, распаковка, упаковка, Arduino.

...