Определение мазок смещение
Либо Мануалы, или измерить его из гистограммы звездных расстояний. Самое оскорбительное смещение - это мазок.
для каждой звезды
проверки, если не размазывается звезды поблизости мазок смещение Если да объединить два в один. Как это зависит от свойств данных. Например, вы можете использовать среднюю позицию звезды, положение звезды, которое находится в начале мага или конца, и т. Д.
Вот небольшой 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
элементов
Здесь Предварительный просмотр результата:
Красные точки обнаруживают звезды из вашего изображения изображения, а синие линии показывают, какие звезды связаны/обнаружены как размазанные.