pythonmatplotlibpyfits

vmin vmax algorithm matplotlib


I write script for calibration of image (dark frame and flat field)...Here is part of code

for n in range(len(img)):
  with pyfits.open(img[n], mode='update', memmap=True) as im:
    imgg = im[0].data
    header = im[0].header
    imgg.astype(float)
    imgg = (imgg - dd) / df
    imgg[np.isnan(imgg)] = 1
    imgg.astype(int)
    plt.imshow(imgg, cmap=plt.cm.Greys_r, vmin=0.5, vmax=1.5)
    plt.show()

This part of code make calibration of image with dark frame and flat field... When I use at the plotting vmin and vmax, I get the right picture but I don't know how vmin and vmax work. I need to apply this on image data (imgg) because when I save data I get images without vmin and vmax...

Any suggestions?

And the second question... How I can save data changes in fits files? When I used im.close() this work only on one file but don't work in loop.

Thanks

edit

OK here is full script

import numpy as np
import pyfits
from matplotlib import pyplot as plt
import glob


dark=glob.glob('.../ha/dark/*.fits')
flat=glob.glob('.../ha/flat/*.fits')
img=glob.glob('.../ha/*.fits')

sumd0 = pyfits.open(dark[0])
sumdd=sumd0[0].data
sumdd.astype(float)
for i in range(1,len(dark)):
     sumdi=pyfits.open(dark[i])
     sumdi=sumdi[0].data
     sumdd=sumdd.astype(float)+sumdi.astype(float)
dd=sumdd/len(dark)

sumf0 = pyfits.open(flat[0])
sumff=sumf0[0].data
sumff.astype(float)
for i in range(1,len(flat)):
     sumfi=pyfits.open(flat[i])
     sumfi=sumfi[0].data
     sumff=sumff.astype(float)+sumfi.astype(float)

ff=sumff/len(flat)

df=(ff-dd)

for n in range(len(img)):
    with pyfits.open(img[n],mode='update',memmap=True) as im:
        imgg=im[0].data
        header=im[0].header
        imgg.astype(float)
        imgg=(imgg-dd)/df
        imgg.astype(int)
plt.imshow(imgg,cmap=plt.cm.Greys_r,vmin=0.5,vmax=1.5)
plt.show()

Solution

  • A bit ofuscated question but I think this does what you want (from your comment in the other answer).

    To clamp the data with the same behaviour as vmin and vmax, use np.clip:

    np.clip(data, min, max)
    

    In your case:

    data = np.clip(data, 0.5, 1.5)