vmin vmax algorithm matplotlib

好久不见. 提交于 2019-12-22 11:18:06

问题


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()

回答1:


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)



回答2:


The use of vmin and vmax arguments in imshow are used in conjunction with norm to normalize your data.

Example:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,10,10)
y = np.sin(x)

data = np.array([x,y])

# WITHOUT VMIN AND VMAX
im = plt.imshow(data,cmap = plt.get_cmap('jet'))
plt.colorbar(im)
plt.show() 

You get a plot like this, wherein imshow normalizes the data to its min and max.

But when we set vmin and vmax to 0 and 1, the colours will be normalised as if there was a value 0 and a value 1 present in the data.

Here we change imshow as

im = plt.imshow(data,cmap = plt.get_cmap('jet'), vmin=0, vmax=1)

as you can see from the colourbar that it is normalised to 0 and 1.



来源:https://stackoverflow.com/questions/31232733/vmin-vmax-algorithm-matplotlib

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!