创建彩色RGB图像#
RGB图像可以使用matplotlib的能力生成三种颜色的图像。一般来说,RGB图像是一个MxNx3数组,其中M是y维,N是x维,length-3层分别表示红色、绿色和蓝色。可以指定表示alpha(不透明度)值的第四层。
Matplotlib有几个工具可以在 matplotlib.colors .
Astropy的可视化工具可用于更改RGB图像各个层的拉伸和缩放。对于浮点数,每个图层的刻度必须为0-1(整数为0-255);超出该范围的值将被剪裁。
使用Lupton等人(2004)方案的Ruby图像#
Lupton et al. (2004) 描述了一种用于从三个单独的高动态范围阵列产生红-绿-蓝合成图像的“最佳”算法。此方法在 make_lupton_rgb() 作为一个方便的包装函数和一组相关的类,以提供替代的缩放。SDSS SkyServer彩色图像是使用这种技术的变体制作的。要生成具有默认(arcsinh)缩放比例的彩色PNG文件,请执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
from astropy.visualization import make_lupton_rgb
rng = np.random.default_rng()
image_r = rng.random((100,100))
image_g = rng.random((100,100))
image_b = rng.random((100,100))
image = make_lupton_rgb(image_r, image_g, image_b, stretch=0.5)
fig, ax = plt.subplots()
ax.imshow(image)
该方法要求三个图像对齐并且具有相同的像素比例和大小。改变 interval 从实例的默认值 ManualInterval() 与 vmin=0 (或者,传递关键字 minimum )将改变黑色级别。的参数 stretch 和 Q 将更改黑色和白色之间的值的缩放方式。
有关更深入的示例,请下载 g , r , i 在Hickson 88组周围区域的SDSS帧(它们将分别用作蓝色、绿色和红色通道),并尝试下面的示例并将其与图1进行比较 Lupton et al. (2004) :
import matplotlib.pyplot as plt
from astropy.visualization import make_lupton_rgb
from astropy.io import fits
from astropy.utils.data import get_pkg_data_filename
# Read in the three images downloaded from here:
g_name = get_pkg_data_filename('visualization/reprojected_sdss_g.fits.bz2')
r_name = get_pkg_data_filename('visualization/reprojected_sdss_r.fits.bz2')
i_name = get_pkg_data_filename('visualization/reprojected_sdss_i.fits.bz2')
g = fits.getdata(g_name)
r = fits.getdata(r_name)
i = fits.getdata(i_name)
rgb_default = make_lupton_rgb(i, r, g, filename="ngc6976-default.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb_default, origin='lower')
上面的图像是用默认参数生成的。然而,使用不同的比例,例如Q=10,拉伸=0.5,星系的微弱特征就会显现出来。与图1比较 Lupton et al. (2004) 或 SDSS Skyserver image .
rgb = make_lupton_rgb(i, r, g, Q=10, stretch=0.5, filename="ngc6976.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb, origin='lower')
使用任意拉伸的Ruby图像#
用于生成复合Ruby图像的许多其他方法都是可能的。替代选择包括使用例如,线性或log延伸,与可选的数据剪裁和标准化相结合(例如,正如DS 9或其他数据查看器中经常使用的那样)。
单个图像的图像拉伸和规范化方法在中演示 图像拉伸和归一化 .使用便利功能,这些缩放扩展到了生成Ruby图像 make_rgb() 的子类的实例, BaseStretch 除了的子集的实例之外 BaseInterval 指定规范化或此类实例的长度为3的数组(单独指定每个过滤器的间隔)。
默认情况下, make_rgb() 用作线性伸展 (LinearStretch )和单边手动间隔 (ManualInterval , vmin=0 ).如同 make_lupton_rgb() ,三个图像必须对齐,具有相同的大小和像素比例。
按照上面的例子,我们使用 g , r , i SDSS框架围绕Hickson 88组,现在使用线性缩放。
import numpy as np
import matplotlib.pyplot as plt
from astropy.visualization import make_rgb, ManualInterval
from astropy.io import fits
from astropy.utils.data import get_pkg_data_filename
# Read in the three images downloaded from here:
g_name = get_pkg_data_filename('visualization/reprojected_sdss_g.fits.bz2')
r_name = get_pkg_data_filename('visualization/reprojected_sdss_r.fits.bz2')
i_name = get_pkg_data_filename('visualization/reprojected_sdss_i.fits.bz2')
g = fits.getdata(g_name)
r = fits.getdata(r_name)
i = fits.getdata(i_name)
# Use the maximum value of the 99.5% percentile over all three filters
# as the maximum value:
pctl = 99.5
maximum = 0.
for img in [i,r,g]:
val = np.percentile(img,pctl)
if val > maximum:
maximum = val
rgb = make_rgb(i, r, g, interval=ManualInterval(vmin=0, vmax=maximum),
filename="ngc6976-linear.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb, origin='lower')
对于具有高动态范围的图像,将值计算为以下公式:
是有益的。在这种情况下,是的a stretch实例 LogStretch 直接通过:
from astropy.visualization import LogStretch
# Use the maximum value of the 99.95% percentile over all three filters
# as the maximum value:
pctl = 99.95
maximum = 0.
for img in [i,r,g]:
val = np.percentile(img,pctl)
if val > maximum:
maximum = val
rgb_log = make_rgb(i, r, g, interval=ManualInterval(vmin=0, vmax=maximum),
stretch=LogStretch(a=1000), filename="ngc6976-log.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb_log, origin='lower')
通过指定每个过滤器的最大值,可以强调某些对象,例如最红的源:
# Increase the red maximum to emphasize the very reddest sources:
intervals = 3 * [ManualInterval(vmin=0, vmax=maximum)]
intervals[0] = ManualInterval(vmin=0, vmax=30.)
rgb_log = make_rgb(i, r, g, interval=intervals, stretch=LogStretch(a=1000),
filename="ngc6976-log-alt.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb_log, origin='lower')
也可以使用其他伸展,例如平方根:
from astropy.visualization import SqrtStretch
# Use the maximum value of the 99.8% percentile over all three filters
# as the maximum value:
pctl = 99.8
maximum = 0.
for img in [i,r,g]:
val = np.percentile(img,pctl)
if val > maximum:
maximum = val
rgb_sqrt = make_rgb(i, r, g, interval=ManualInterval(vmin=0, vmax=maximum),
stretch=SqrtStretch(), filename="ngc6976-sqrt.jpeg")
fig, ax = plt.subplots()
ax.imshow(rgb_sqrt, origin='lower')