#python #matplotlib #pixel #astropy
Вопрос:
Моя цель с помощью кода-напечатать изображение, на котором я удалил все насыщенные пиксели (пиксели, которые выдают их максимальное значение). Это связано с тем, что я анализирую данные с подходящего изображения звезды.
Инструкция, которую я получил, гласила: «Все, что вам нужно сделать, это выяснить, какое максимальное значение пикселя в 2d-массиве из данных. Затем напишите код, который удалит эти значения, сохраняя при этом изображение. В принципе, то, что я хочу видеть, — это звезда с отверстием посередине, где вы удалили насыщенные пиксели».
Мне удалось найти максимальное значение пикселя (65535), и теперь мне нужно распечатать свое изображение без пикселей с этим конкретным значением.
До сих пор это мой код, но теперь я не знаю, как удалить пиксели с моего изображения.
import numpy as np
from astropy.io import fits
import matplotlib.pyplot as plt
fits_image_filename = "Acturus_V_2s.fit"
hdul = fits.open(fits_image_filename)
data = hdul[0].data
datacut = data[610:710,755:855]
plt.imshow(datacut, origin="lower")
MaxPixelValue = np.amax(datacut)
print(MaxPixelValue)
И это дает результат:
65535 и мой образ
Как я должен удалить эти пиксели?
Комментарии:
1. Вы не можете удалить произвольные пиксели с изображения. Вы можете только придать им другой цвет.
2. Я не совсем понимаю, что вы подразумеваете под «удалением пикселей». Означает ли это, что вы хотите установить значение насыщенных пикселей равным 0? Лучшим выбором может быть установить их на среднее значение окружающих ненасыщенных пикселей. Я не понимаю, как вы могли бы буквально удалить пиксели, поскольку на изображениях обычно нет «дырок» в них.
3. Найдите и вылечите горячие точки в документации по астропии
Ответ №1:
Как отмечалось в комментариях, «удалить» пиксели с изображения, как правило, невозможно. Но есть несколько способов работать с некоторыми пикселями на изображении, оставляя остальные в покое. В общем, для этого вы в конечном итоге создадите логическую маску-массив, имеющий ту же форму, что и ваше изображение, но содержащий значения, которые являются либо True
или False
.
mask = datacut >= MaxPixelValue
Теперь mask
массив содержит True
везде, где исходное изображение насыщено, и False
везде, где еще.
Вы можете установить значения насыщенных пикселей равными NaN, которые Matplotlib будет обрабатывать как пустые пиксели (т. Е. При использовании они не имеют никакого цвета imshow()
).
datacut[mask] = np.nan
Кроме того, вы можете установить насыщенные пиксели на изображении в какой-либо ориентировочный цвет (например, белый или черный).:
datacut[mask] = 0
Или вы можете создать numpy maskedarray
, который представляет собой своего рода комбинацию вашего исходного изображения и маски:
masked_image = np.ma.masked_array(datacut, mask)
Документация numpy содержит краткое описание того, как использовать массивы с масками.
https://numpy.org/doc/stable/reference/maskedarray.generic.html
Я также нашел некоторую документацию от астрофизического сообщества, которая может оказаться полезной, поскольку вы также используете fits
и astropy
. https://prancer.physics.louisville.edu/astrowiki/index.php/Image_processing_with_Python_and_SciPy#Masked_Image_Operations