我创建了一个程序来定位BW图片中的星星,但遗憾的是,在长时间曝光时,星星会变得模糊,导致程序在星星旁边创建一个复制的星星(见图)。删除不需要的星的最佳方法是什么?
这是我正在使用的当前代码:
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]
答案 0 :(得分:0)
定义拖尾偏移量
可以手工制作,也可以根据星距的直方图进行测量。最明显的偏移是涂抹。
检查涂抹偏移附近是否有涂抹的星形如果是,则将两者合并为单个。这取决于数据属性。例如,您可以使用平均星形位置,在涂层或结束开始时的星形位置等。
这里有一些 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
项目预分配空间
此处预览结果:
红点是从您的情节图像中检测到的星星,蓝线表示哪些星星被链接/检测为涂抹。