使用 Numpy 数组缩放像素值

问题描述 投票:0回答:0

如果这是一个重复的问题或不够清楚,我提前道歉。但我会尽量清楚并专注于我目前遇到的问题。所以我正在建立一个天文学模拟,它将模拟恒星亮度随时间的变化。图像本身是一个数组,存储每个像素对应的像素值。这是我目前必须完成这项工作的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from astropy.io import fits
from astropy.utils.data import get_pkg_data_filename
import os
import csv

image_file = get_pkg_data_filename('ngc_3201_V_stack no label (2).fits')
image_data = fits.getdata(image_file)
squareImg = image_data[79:1844, 183:1948]

coord_data = pd.read_csv('test coords.csv', header=0)
X = coord_data['Pixel X'].tolist()
Y = coord_data['Pixel Y'].tolist()

with open('more_stars_test.csv', newline='') as f:
  reader = csv.reader(f)
  Scales = list(reader)
  Scales.pop(0)

for lists in Scales:
    lists.pop(0)

# setting output dir
outputDir = r'C:\Users\me\Downloads\10_stars_test'
os.chdir(outputDir)

# hardcoding variables
dimension = 1765
radius = 5

print("Output dir: " + outputDir)

# loop through each frame
for frame in range(0, len(Scales)):
    # get current frame number
    frameNum = int(frame)
    print("Starting " + str(frameNum), end="... ")

    # scales for each star per frame
    scales = [float(x) for x in Scales[frame]]
    print(scales)

    # loop through each star
    for star in range(0, len(Scales[0])):
        # create coordinate grid circulating around each star position
        a, b = Y[star], X[star]  # (y,x)
        x, y = np.ogrid[-a:dimension - a, -b:dimension - b]

        # create mask based on those coordinates
        mask = (x ** 2) + (y ** 2) <= (radius ** 2)
        invertedMask = np.invert(mask)
        maskedStar = squareImg * mask
        starRemoved = squareImg * invertedMask

        # scale brightness according to scales
        print(scales[star])
        scaledMaskedStar = maskedStar * float(scales[star])
        scaledMaskedStar[(1 < scaledMaskedStar) & (scaledMaskedStar <= 120)] = 120

        # export final frame with corrected star brightness
        finalFrame = scaledMaskedStar + starRemoved

    # save file with all stars corrected
    print("Saving frame number " + str(frameNum))
    fileName = os.path.join(outputDir, f'frame_{frameNum}.png')
    plt.imsave(fileName, finalFrame, cmap='gray', vmin=78.791, vmax=528.5)

作为一个解释,坐标 csv 文件保存每颗星的像素坐标,因此我可以为每颗星构建一个掩码,比例因子 csv 保存浮点值,我乘以掩码以变亮或变暗在给定的框架中加星。比例因子 csv 的每一行都包含每帧所有星星的比例因子。也就是说,第 1 行中的单元格 1 具有第一帧中星 1 的比例因子。第 2 行中的单元格 2 具有第一帧中星 2 的比例因子,依此类推。

我目前遇到的问题是比例因子似乎并未应用于每一帧。所以我有效地为每一帧保存了原始图像。我有很多打印语句散布在我的循环中,以查看是否有一些功能根本无法正常工作,乍一看一切似乎都很好。就像每个星星的每个缩放因子一样,每个帧都像它应该的那样打印。只是我无法正确缩放原始图像。如果有任何不清楚的地方,我可以在评论中进一步解释。无论如何,欢迎任何关于如何解决这个问题的见解

重申一下,这个项目的目标是模拟恒星亮度随时间的变化。所以我希望看到图像中单个恒星周围的区域随着时间变得更亮/更暗。到目前为止,我一直在尝试使用数组索引来查看是否是问题所在,但我得到的结果是一样的。我能够确认我的代码主要用于这段代码

print(scales[star])
scaledMaskedStar = maskedStar * float(scales[star])
scaledMaskedStar[(1 < scaledMaskedStar) & (scaledMaskedStar <= 120)] = 120

也就是说,任何给定帧中每颗星的比例因子都按预期打印出来。我认为问题在于缩放计算本身和图像未正确保存。但是,我不确定为什么会这样

python numpy image-processing multidimensional-array
© www.soinside.com 2019 - 2024. All rights reserved.