преобразовать ИК-изображение в RGB с python - PullRequest
1 голос
/ 22 апреля 2020

Код ниже предназначен для получения инфракрасного изображения (ч / б) и преобразования его в RGB. Это успешно, но со значительным шумом. Я включил несколько строк для уменьшения шума, но они, похоже, не помогают. Я включил начальные / итоговые фотографии ниже. Любые советы / исправления приветствуются и заранее благодарим вас!

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

path = askdirectory(title='Select PNG Folder') # shows dialog box and return the path
outpath = askdirectory(title='Select SAVE Folder') 

# wavelength in microns
MWIR = 4.5

R = .642
G = .532
B = .44

vector = [R, G, B]
vectorsum = np.sum(vector)
vector = vector / vectorsum #normalize
vector = vector*255 / MWIR #changing this value changes the outcome significantly so I 
#have been messing with it in the hopes of fixing it but no luck so far.
vector = np.power(vector, 4)

for file in os.listdir(path):
  if file.endswith(".png"):
    imIn = io.imread(os.path.join(path, file))
    imOut = imIn * vector
    ret,thresh = cv2.threshold(imOut,64,255,cv2.THRESH_BINARY)
    kernel = np.ones((5, 5), np.uint8)
    erode = cv2.erode(thresh, kernel, iterations = 1)
    result = cv2.bitwise_or(imOut, erode)
    io.imsave(os.path.join(outpath, file) + '_RGB.png',imOut.astype(np.uint8))

starting image result image

Ответы [ 3 ]

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

Ваш шум выглядит как совершенно случайные значения, поэтому я подозреваю, что у вас ошибка при преобразовании от float до uint8. Но вместо того, чтобы бросить все для себя, почему бы вам просто не использовать:

  imOut = cv2.cvtColor(imIn,cv2.COLOR_GRAY2BGR)
0 голосов
/ 23 апреля 2020

Вот один из способов сделать это в Python / OpenCV.

Вероятно, ваша проблема в том, что значения вашего канала превышают 8-битный диапазон.

Извините, я не понимаю Отношения между вашими весами R, G, B и вашим MWIR. Деление на MWIR ничего не изменит, если ваши веса правильно нормализуются.

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('car.jpg')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# make color channels
red = gray.copy()
green = gray.copy()
blue = gray.copy()

# set weights
R = .642
G = .532
B = .44

MWIR = 4.5

# get sum of weights and normalize them by the sum
R = R**4
G = G**4
B = B**4
sum = R + G + B
R = R/sum
G = G/sum
B = B/sum
print(R,G,B)

# combine channels with weights
red = (R*red)
green = (G*green)
blue = (B*blue)
result = cv2.merge([red,green,blue])

# scale by ratio of 255/max to increase to fully dynamic range
max=np.amax(result)
result = ((255/max)*result).clip(0,255).astype(np.uint8)

# write result to disk
cv2.imwrite("car_colored.png", result)

# display it
cv2.imshow("RESULT", result)
cv2.waitKey(0)


Результат

enter image description here

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

Если шум исходит от самого датчика, например, зернистый шум, вам нужно изучить алгоритмы шумоподавления. scikit-image и opencv предоставляют некоторые шумоподавляющие алгоритмы, которые вы можете попробовать. Может быть, посмотрите на это и это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...