Construction of an artificial (but realistic) image

Before we move on to looking at a real image, let's spend a few minutes getting comfortable with what each of the different sources of counts look like in an artificial image. The advantage is that we can control how much of each count source goes into the image. Looking at extreme examples can help build an understanding of what's going on in your images.

Створення штучного (але реалістичного) зображення

Перед тим як ми перейдемо до роботи зі справжніми зображеннями, давайте оглянемо як виглядають різні джерела сигналу на штучному зображенні. Таким чином ми матимемо можливість контролювати скільки сигналу від кожного джерела йде до зображення. Оглядаючи крайні варіанти ми можемо краще зрозуміти що відбувається з нашими зображеннями

Imports

Almost all of the notebooks in this tutorial will start with the import of the Python packages needed for that notebook. The lines below set up matplotlib, a widely used plotting package.

Імпорт

Майже всі блокноти в цьому посібнику починаються з імпортування пакетів Python які потрібні для блокнота. Секція нижче налаштовує matplotlib, популярний пакет для створення графіків.

In [1]:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from photutils.aperture import EllipticalAperture
In [2]:
# Use custom style for larger fonts and figures
plt.style.use('guide.mplstyle')
In [3]:
# Use custom style for larger fonts and figures
# Використання власного стилю для більших шрифтів та зображень
plt.style.use('guide.mplstyle')

The Python file referenced below, convenience_functions.py, contains a few functions for convenient display of images in a notebook. Note that by clicking the above link you can read (or edit) the file in the browser. You can also read/edit it in your preferred editor, but it's handy to know that editing Python files in the Jupyter notebook environment is possible.

Файл Python зазначений нижче, convenience_functions.py, містить декілька функцій для зручного відображення зображень у блокноті. Натиснувши на лінк, ви можете переглянути (та редагувати) цей файл у браузері. Цей файл також можна переглядати/редагувати у інших програмах, але добре знати що у вас є можливість редагувати такі файли в середовищі Jupyter блокноту.

In [4]:
from convenience_functions import show_image
WARNING: AstropyDeprecationWarning: block_reduce was moved to the astropy.nddata.blocks module.  Please update your import statement. [astropy.nddata.utils]

Start: a blank image

We'll begin with the simplest possible image: an array of zeros. The dimensions of the image below are chosen to match some real images we'll be working with later.

Початок: пусте зображення

Ми почнемо з найпростішого зображення: ряди нулів. Розмір цього зображення збігається з розміром справжніх зображень з якими ми працюватимемо пізніше.

In [5]:
synthetic_image = np.zeros([1000, 1000])
In [6]:
show_image(synthetic_image, cmap='gray')

Add some read noise

With each of the things we add, we'll write a small function for adding so that it's easier to experiment with different values. Read noise has a Gaussian distribution; the standard deviation of the Gaussian (in counts) is the read noise (in electrons) divided by the gain (in electrons per count). Read noise is almost always given in electrons.

Note that each time you run this function you'll get a different set of pixels so that it behaves like real noise.

Додаємо шум зчитування (read noise)

Кожного разу коли ми додаватимемо щось нове до зображення, ми будемо писати невелику функцію для "додавання" щоб нам було простіше експерементувати з різними параметрами. Шум зчитування має нормальний розподіл (розподіл Ґауса); стандартне відхилення розподілу Ґауса (у значеннях пікселів) це шум зчитування (у кількості електронів) поділене на посилення напруги. Шум зчитування маже завжди подається у електронах.

Кожного разу ця функція створюватиме різну комбінацію значень пікселів, тому вона поводиться як справжній шум.

In [7]:
def read_noise(image, amount, gain=1):
    """
    Generate simulated read noise.
    
    Parameters
    ----------
    
    image: numpy array
        Image whose shape the noise array should match.
    amount : float
        Amount of read noise, in electrons.
    gain : float, optional
        Gain of the camera, in units of electrons/ADU.
    """
    shape = image.shape
    
    noise = np.random.normal(scale=amount/gain, size=shape)
    
    return noise
In [8]:
plt.figure()
noise_im = synthetic_image + read_noise(synthetic_image, 5)
show_image(noise_im, cmap='gray')
<Figure size 1000x1000 with 0 Axes>