2014-09-06 4 views
1

Я хочу наложить два вида одной и той же сцены - одно изображение белого цвета (монохромное, используется для справки), а другое - изображение в определенной полосе (у которой есть реальные данные, которые я показываю).Правильный способ наложения многозонных изображений?

Изображение с белым светом является «ссылкой», изображение данных «данные». Это обычные 2D-массивы с одинаковыми размерами. Я хочу, чтобы показать белое эталонное изображение с помощью «серой» цвета карты, и изображения данных, используя «горячую» цветовую карту.

Что такое «правильный» способ сделать это?

Я начал с этим:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

hotm = cm.ScalarMappable(cmap='hot') 
graym = cm.ScalarMappable(cmap='gray') 

ref_rgb = graym.to_rgba(reference) # rgba reference image, 'gray' color map 
data_rgb = hotm.to_rgb(data) # rgba data image, 'hot' color map 

plt.imshow(ref_rgb + data_rgb) 

Это не сработало, потому что в plt.imshow() вызова сумма переполнила диапазон 0..1 (или, может быть 0..255, это сбивает с толку) и дал мне сумасшедшие цвета.

Тогда я заменил последнюю строку с этим:

plt.imshow(ref_rgb/2 + data_rgb/2) 

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

Наконец, я попытался это:

plt.imshow(np.maximum(ref_rgb, data_rgb)) 

Это, кажется, дает лучший результат, но я боюсь, что большая часть моего «данные» утрачивается, имеющие более низкие R, G, или б значения, чем эталонное изображение.

Что такое «правильный» или «обычный» способ сделать это?

ответ

0

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

Я никогда не пользовался matplotlib, но, быстро взглянув на документы, он выглядит как matplotlib.cm дает вам возможность иметь пиксельные данные в виде целых чисел в диапазоне 0..255 или как плавающие в диапазон 0.0.1.1. Формат float более удобен для обработки арифметических изображений, поэтому я предполагаю, что это относится к остальной части этого ответа.

Мы можем выполнять базовую обработку изображений, выполняя простые арифметические действия по значениям пикселей RGB. Грубо говоря, добавление (или вычитание) константы к значению RGB для всех ваших пикселей изменяет яркость изображения, умножая ваши пиксели на постоянное изменение контраста изображения, а увеличение ваших пикселей до постоянной (положительной) мощности изменяет гамму изображения. Конечно, вам нужно убедиться, что эти операции не вызывают отклонения значений цвета вне диапазона. Это не проблема для настройки гаммы или регулировки контрастности (при условии, что константа находится в диапазоне 0.0.1.1), но это может быть проблемой для изменения яркости. Более тонкая яркость & может быть достигнута с помощью подходящих комбинаций сложения и умножения.

При выполнении такого рода вещей обычно является хорошей идеей нормализовать значения пикселей в ваших данных изображения до диапазона 0.0.1.1, либо до &/или после выполнения основной обработки.

Ваш код, по существу, обрабатывает серые справочные данные как вид маски и использует его значения вместо использования константы для работы с пикселями данных цвета по пикселям. Как вы видели, взяв среднее значение ref_rgb &, data_rgb приводит к размытому изображению, потому что вы уменьшаете контраст.Но посмотрите, что произойдет, когда вы умножаете ref_rgb & data_rgb: контраст обычно увеличивается, потому что темные области в ref_rgb будут затемнять соответствующие пиксели в data_rgb, но яркие области в ref_rgb оставят соответствующие пиксели в data_rgb практически нетронутыми.

ImageMagick имеет несколько хороших примеров обработки арифметических изображений.

Еще одна вещь, которую нужно попробовать - это преобразовать данные data_rgb в формат HSV и заменить данные V (value) на данные оттенков серого из ref_rgb. И вы можете делать подобные трюки с данными S (насыщения), хотя эффект, как правило, немного более тонкий.

Смежные вопросы