2017-02-03 7 views
-1

Я создал программу для поиска звезд с 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] 

ответ

0
  1. Определение мазок смещение

    Либо Мануалы, или измерить его из гистограммы звездных расстояний. Самое оскорбительное смещение - это мазок.

  2. для каждой звезды

    проверки, если не размазывается звезды поблизости мазок смещение Если да объединить два в один. Как это зависит от свойств данных. Например, вы можете использовать среднюю позицию звезды, положение звезды, которое находится в начале мага или конца, и т. Д.

Вот небольшой 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 является УСЬ инкапсулированный 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

Красные точки обнаруживают звезды из вашего изображения изображения, а синие линии показывают, какие звезды связаны/обнаружены как размазанные.