Как визуализировать 16-битное изображение в градациях серого с помощью cv2.imshow ()? - PullRequest
4 голосов
/ 13 января 2020

У меня есть набор изображений дронов в градациях серого в формате tiff с 16-битным разрешением, при котором человека можно увидеть движущимся. Как я могу визуализировать эти изображения в OpenCV как обычное изображение, чтобы я мог видеть информацию в изображении в OpenCV? В настоящее время, когда я пытаюсь прочитать и показать изображение, я вижу черное изображение.

import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"],IMREAD_ANYCOLOR | IMREAD_ANYDEPTH)

cv2.imshow("image", image)
cv2.waitKey(0)

Я пробовал приведенный выше код, но он по-прежнему отображает полностью черное изображение. Однако, когда я конвертирую изображение в png, а затем использую приведенный выше код, он работает нормально, чего я не хочу делать из-за потери информации.

Вот ссылка на образец изображения. Все изображения содержат различную информацию.

https://filebin.net/n3oidsqn70eq8a9x/gelmer_gas_0_Raw_316_4245_2942_1455208775.tif?t=c2m8vnsn

Изображение должно быть таким, как показано ниже. Это было открыто с другим программным обеспечением только для визуальных целей

enter image description here

1 Ответ

2 голосов
/ 13 января 2020

Как вы заявили ранее, загрузка проста:

img = cv2.imread("a.tif", cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)

Тогда у вас есть разные варианты визуализации теплового изображения. Простой наивный подход заключается в нормализации от минимального до максимального значения:

normed = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

enter image description here

После этого вы можете раскрасить его с помощью карты цветов:

color = cv2.applyColorMap(normed, cv2.COLORMAP_JET)

enter image description here

Я бы предложил зафиксировать температурный диапазон и обрезать остальные значения, чтобы получить изображение с цветами, которые можно сравнивать между несколько изображений или видео. Чтобы сделать это, вы можете взять идею из этого ответа , предполагая, что ваши новые min и max равны 0 и 255, а ваши старые min и max - это диапазон, который вам нужен.

Чтобы быть более точным c, в вашем случае вам нужно что-то вроде:

def normalizeImg(low, high, img):
    imgClip = np.clip(img, low, high)
    maxVal = np.max(imgClip)
    minVal = np.min(imgClip)
    return np.uint8((255.)/(maxVal-minVal)*(imgClip-maxVal)+255.)

Где низкие и высокие значения - необработанные значения, к которым вы хотите нормализоваться. И тогда вы используете это как:

def celsiusToPixel(val):
    return (val + 273.15) / 0.04

rangeToUse = [celsiusToPixel(20), celsiusToPixel(30)] # from 20-30° celsius
normed_range =  normalizeImg(rangeToUse[0], rangeToUse[1], img)

enter image description here

Я надеюсь, что ничего не пропустил, но если у вас есть вопросы, просто спросите :)

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