преобразовать массив numpy в uint8, используя python - PullRequest
1 голос
/ 22 апреля 2020

Мой код ниже предназначен для получения пакета изображений и преобразования их в RGB. Но я продолжаю получать ошибку, которая говорит, что преобразовать в тип uint8. Я видел другие вопросы, касающиеся преобразования в uint8, но ни одного, прямо из массива в uint8. Любые советы о том, как это сделать, приветствуются, спасибо!

from skimage import io
import numpy as np
import glob, os
from tkinter import Tk
from tkinter.filedialog import askdirectory
import cv2

# wavelength in microns
MWIR = 4.5
R = .692
G = .582
B = .140

rgb_sum = R + G + B;
NRed = R/rgb_sum;
NGreen = G/rgb_sum;
NBlue = B/rgb_sum;

path = askdirectory(title='Select PNG Folder') # shows dialog box and return the path
outpath = askdirectory(title='Select SAVE Folder') 
for file in os.listdir(path):
    if file.endswith(".png"):
        imIn = io.imread(os.path.join(path, file))
        imOut = np.zeros(imIn.shape)    

        for i in range(imIn.shape[0]): # Assuming Rayleigh-Jeans law
            for j in range(imIn.shape[1]):
                imOut[i,j,0] = imIn[i,j,0]/((NRed/MWIR)**4)
                imOut[i,j,1] = imIn[i,j,0]/((NGreen/MWIR)**4)
                imOut[i,j,2] = imIn[i,j,0]/((NBlue/MWIR)**4)
        io.imsave(os.path.join(outpath, file) + '_RGB.png', imOut)

код, который я пытаюсь интегрировать в свой собственный (найденный в другом потоке, используемый для преобразования типа в uint8):

info = np.iinfo(data.dtype) # Get the information of the incoming image type
data = data.astype(np.float64) / info.max # normalize the data to 0 - 1
data = 255 * data # Now scale by 255
img = data.astype(np.uint8)
cv2.imshow("Window", img)

спасибо!

1 Ответ

1 голос
/ 22 апреля 2020

Обычно imInt имеет тип uint8, после нормализации он имеет тип float32 из-за причины приведения при делении. Вы должны преобразовать обратно в uint8 перед сохранением в файл PNG:

io.imsave(os.path.join(outpath, file) + '_RGB.png', imOut.astype(np.uint8))

Обратите внимание, что два цикла не нужны, вместо них можно использовать numpy векторные операции:

MWIR = 4.5

R = .692
G = .582
B = .140

vector = [R, G, B]
vector = vector / vector.sum()
vector = vector / MWIR
vector = np.pow(vector, 4)

for file in os.listdir(path):
  if file.endswith((".png"):
    imgIn = ...
    imgOut = imgIn * vector
    io.imsave(
      os.path.join(outpath, file) + '_RGB.png', 
      imgOut.astype(np.uint8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...