Как удалить насыщенные пиксели с изображения?

#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