创建额外的星星,最有效的方法摆脱它们?

时间:2017-02-03 17:46:17

标签: python-2.7 astronomy

我创建了一个程序来定位BW图片中的星星,但遗憾的是,在长时间曝光时,星星会变得模糊,导致程序在星星旁边创建一个复制的星星(见图)。删除不需要的星的最佳方法是什么?

img

这是我正在使用的当前代码:

def starfinder(filename) :

f=pyfits.open(filename)
image_data=snd.median_filter(f[0].data,3)                              #gets rid of the hot pixels
thld = image_data.mean() + 2*image_data.std()                          #limits the pixel value of bright stars
labels, number = snd.label(image_data > thld, np.ones((3,3)))          #turns any values over the threshold into a 3x3 array of ones
centres = snd.center_of_mass(image_data, labels, range(1,number+1))    #center of mass finds the centre of the 3x3 array

star_centres = np.around(centres, decimals=0)
y = np.array(star_centres)[:,0]
x = np.array(star_centres)[:,1]
np.savetxt("star_positions.txt",star_centres)

#plt.plot(x,y,"ro")
plt.scatter(x, y, marker='o', c='r', s=5, label='the data')

return len(x)[enter image description here][1]

1 个答案:

答案 0 :(得分:0)

  1. 定义拖尾偏移量

    可以手工制作,也可以根据星距的直方图进行测量。最明显的偏移是涂抹。

  2. 每个明星
  3. 检查涂抹偏移附近是否有涂抹的星形如果是,则将两者合并为单个。这取决于数据属性。例如,您可以使用平均星形位置,在涂层或结束开始时的星形位置等。

  4. 这里有一些 C ++ 示例:

    picture pic1; // your image
    const DWORD cl_star =0x008C0000;
    const DWORD cl_space=0x00FFFFFF;
    const int smear_max=30; // max smear size [pixels]
    int i,j,x,y,r=3,dx0,dx1,dy0,dy1;
    DWORD c;
    
    List<int> xy;           // star (x,y)
    int hisx[smear_max];    // histogram of star dx distances
    int hisy[smear_max];    // histogram of star dy distances
    
    // get star coordinates
    for (y=0;y<pic1.ys-1;y++)
     for (x=0;x<pic1.xs-1;x++)
      if (pic1.p[y][x].dd==cl_star)
        {
        xy.add(x);
        xy.add(y);
        x++; if (pic1.p[y][x].dd==cl_star) pic1.p[y][x].dd=cl_space;
        y++; if (pic1.p[y][x].dd==cl_star) pic1.p[y][x].dd=cl_space;
        x--; if (pic1.p[y][x].dd==cl_star) pic1.p[y][x].dd=cl_space;
        y--;                               pic1.p[y][x].dd=cl_space;
        }
    // compute hisogram of star |dx|,|dy| distance
    for (i=0;i<smear_max;i++) hisx[i]=0;
    for (i=0;i<smear_max;i++) hisy[i]=0;
    for (i=0;i<xy.num;i+=2)
     for (j=i+2;j<xy.num;j+=2)
        {
        x=xy[i+0]-xy[j+0]; if (x<0) x=-x; if (x<smear_max) hisx[x]++;
        y=xy[i+1]-xy[j+1]; if (y<0) y=-y; if (y<smear_max) hisy[y]++;
        }
    // find most common ones
    for (i=0,j=0;i<smear_max;i++) if (hisx[j]<hisx[i]) j=i; dx0=j-1; dx1=j+1;
    for (i=0,j=0;i<smear_max;i++) if (hisy[j]<hisy[i]) j=i; dy0=j-1; dy1=j+1;
    // render found stars
    pic1.bmp->Canvas->Pen->Color=clBlack;
    pic1.bmp->Canvas->Brush->Color=clRed;
    for (i=0;i<xy.num;)
        {
        x=xy[i]; i++;
        y=xy[i]; i++;
        pic1.bmp->Canvas->Ellipse(x-r,y-r,x+r,y+r);
        }
    // find smeared stars and render join line
    pic1.bmp->Canvas->Pen->Color=clBlue;
    pic1.bmp->Canvas->Pen->Width=2;
    for (i=0;i<xy.num;i+=2)
     for (j=i+2;j<xy.num;j+=2)
        {
        x=xy[i+0]-xy[j+0]; if (x<0) x=-x;
        y=xy[i+1]-xy[j+1]; if (y<0) y=-y;
        if ((x>=dx0)&&(x<=dx1))
         if ((y>=dy0)&&(y<=dy1))
            {
            pic1.bmp->Canvas->MoveTo(xy[i+0],xy[i+1]);
            pic1.bmp->Canvas->LineTo(xy[j+0],xy[j+1]);
            // here you can merge the stars i,j together instead.
            }
        }
    pic1.bmp->Canvas->Pen->Width=1;
    

    我将自己的图片类用于图片,因此有些成员是:


    xs,ys是图像的大小(以像素为单位)
    p[y][x].dd(x,y)位置的像素,为32位整数类型
    clear(color)使用color清除整个图像
    resize(xs,ys)将图片调整为新分辨率
    bmp VCL 已封装 GDI 具有Canvas访问权限的位图
    pf保存图像的实际像素格式:

    enum _pixel_format_enum
        {
        _pf_none=0, // undefined
        _pf_rgba,   // 32 bit RGBA
        _pf_s,      // 32 bit signed int
        _pf_u,      // 32 bit unsigned int
        _pf_ss,     // 2x16 bit signed int
        _pf_uu,     // 2x16 bit unsigned int
        _pixel_format_enum_end
        };
    


    color和像素编码如下:

    union color
        {
        DWORD dd; WORD dw[2]; byte db[4];
        int i; short int ii[2];
        color(){}; color(color& a){ *this=a; }; ~color(){}; color* operator = (const color *a) { dd=a->dd; return this; }; /*color* operator = (const color &a) { ...copy... return this; };*/
        };
    

    这些乐队是:

    enum{
        _x=0,   // dw
        _y=1,
    
        _b=0,   // db
        _g=1,
        _r=2,
        _a=3,
    
        _v=0,   // db
        _s=1,
        _h=2,
        };
    

    我也使用我的动态列表模板:


    List<double> xxx;double xxx[];相同
    xxx.add(5);5添加到列表的末尾
    xxx[7]访问数组元素(安全)
    xxx.dat[7]访问数组元素(不安全但快速直接访问)
    xxx.num是数组的实际使用大小
    xxx.reset()清除数组并设置xxx.num=0
    xxx.allocate(100)100项目预分配空间

    此处预览结果:

    preview

    红点是从您的情节图像中检测到的星星,蓝线表示哪些星星被链接/检测为涂抹。