2014-12-02 2 views
2

Немного с некоторыми образцами кода scikit-image и pyplot Я нашел разные результаты на своих изображениях в зависимости от того, как я применяю свои цветовые карты, и я не знаю почему.Цветовые карты Pyplot, показывающие разные результаты

Когда я применяю цветовую карту в качестве плагина при показе изображения, все идет хорошо, когда я делаю это непосредственно к изображению, он становится абсолютно черным. Я смущен, потому что хочу применить эти цветовые карты к изображениям, которые хочу сохранить (вместо шоу), и я не знаю, как это сделать правильно.

import matplotlib.pyplot as plt 
from skimage import data 
from skimage.color import rgb2hed 


ihc_rgb = data.immunohistochemistry() 
ihc_hed = rgb2hed(ihc_rgb) 

fig, axes = plt.subplots(2, 2, figsize=(7, 6)) 
ax0, ax1, ax2, ax3 = axes.ravel() 

ax0.imshow(ihc_hed[:, :, 0], cmap=plt.cm.gray) 
ax0.set_title("plugin") 

ax1.imshow(plt.cm.gray(ihc_hed[:, :, 0])) 
ax1.set_title("direct") 

[это идет на немного]

enter image description here

+0

Хорошо! И у Хитц, и у Стефана были очень хорошие ответы, но, наконец, Стефан меня подвел. Спасибо, что помогли этому новичку. – Andor

+0

Для будущих вопросов: не используйте библиотеку (здесь matplotlib) только для того, чтобы задать вопрос. Ваша проблема была связана с масштабированием скинов – hitzg

+0

Спасибо @hitzg, сначала я не знал, что моя проблема связана с масштабированием. Теперь я знаю. Моя вина. – Andor

ответ

3

Значения внутри ihc_hed[:, :, 0] лежат между -1.37 и -0.99. Поведение по умолчанию imshow - это отображение всего диапазона значений. plt.cm.gray, с другой стороны, работает с изображениями со значениями от 0 до 1.

Автоматическое масштабирование сохраняет вас в первом случае, но не во втором. Я рекомендую всегда использовать imshow с фиксированным диапазоном: imshow(image, vmin=0, vmax=1, cmap='gray')

+0

Как можно перемасштабировать второй случай? Я хочу применить карту к изображению, которое я сохранил вместо того, чтобы показывать его ... Спасибо! – Andor

+3

Вы можете импортировать '' rescale_intensity'' из '' skimage.exposure'', затем: '' rescaled_image = exposure.rescale_intensity (image, out_range = (0, 1)) '' –

1

От ваш комментарий к Stefan van der Walt «s answer я делаю вывод, что вы не хотите, чтобы сохранить цифры Matplotlib, но изображения непосредственно. Как указал Стефан, вам нужно масштабировать значения, прежде чем вы сможете использовать цветовую палитру. Matplotlib предоставляет класс Normalize для этого:

import matplotlib.pyplot as plt 
import matplotlib.colors 
from skimage import data 
from skimage.color import rgb2hed 

ihc_rgb = data.immunohistochemistry() 
ihc_hed = rgb2hed(ihc_rgb) 

fig, axes = plt.subplots(1, 3, figsize=(8, 3)) 
ax0, ax1, ax2 = axes.ravel() 

ax0.imshow(ihc_hed[:, :, 0], cmap=plt.cm.gray) 
ax0.set_title("plugin") 

ax1.imshow(plt.cm.gray(ihc_hed[:, :, 0])) 
ax1.set_title("direct") 

norm = matplotlib.colors.Normalize() 
gray_image = plt.cm.gray(norm(ihc_hed[:,:,0])) 

ax2.imshow(gray_image) 
ax2.set_title("direct with norm") 

for a in axes: 
    a.xaxis.set_visible(False) 
    a.yaxis.set_visible(False) 

plt.gcf().tight_layout() 
plt.show() 

enter image description here

+0

Забавно, когда я применяю нормализацию и изображение не содержит значений ниже 0 и выше 1, оно становится пустым (белый). Я проверяю варианты нормализации, чтобы найти, почему ... – Andor

+0

Что вы подразумеваете под * оно становится пустым *? После сохранения на диск? Я не могу воспроизвести проблему – hitzg

+0

перед сохранением, проверьте это и извините за мой паршивый код: [Код в pastebin] (http://pastebin.com/aTUdgntV) (ему нужна папка «Ресурсы», извините) – Andor

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