matlab画图点的形状星,用Matlab做星点识别.pdfVIP

  • 16
  • 0
  • 约3.47千字
  • 约 4页
  • 2023-03-07 发布于江苏
  • 举报

matlab画图点的形状星,用Matlab做星点识别.pdf

matlab画图点的形状星,⽤Matlab做星点识别 随着⼯作学习的深⼊,和原始天⽂照⽚的接触越来越 ,发现对天⽂专业来说数字图像处理还是⼀门很有⽤的基础课程,连CMB功率谱之 类看上去⾼深莫测的技术,其实都写在信号处理专业的本科教材⾥,把这段流程完全交给现成软件或者编程⼈员是没办法真正理解观测数据 的。开始补课了,先从找星星开始~ ⽐如我们有上⾯这张照⽚, 图中的亮点就是实际拍摄的星空,但左中和右下两个最亮的⽩点都是打在CCD上的宇宙线,它们能量很集中,没 有扩展的形状。那要怎么让程序找到这些天体的位置,并识别出正确的星点呢? 其实所有的图⽚都可以看作是⼆维矩阵,其中的每个元素都对应空间的⼀个像素。天⽂⿊⽩照⽚中记录的值称作ADU(analog-to-digital- units 模数转换单位),只要知道了记录设备的基本参数就可以从这个值得到最初接收到的光⼦数。现在我们要将这个⼆维矩阵读⼊。原始的 天⽂照⽚都是FITS格式,Matlab中⾃带了两个处理fits⽂件的命令,读⽂件头的fitsinfo和读数据的fitsread,别看少,这就够了,只要能 将图像转化为⼆维矩阵,剩下的就都是数学问题矩阵操作了。要提醒的是,如果要⽤imshow按8位灰度显⽰图⽚,需要把矩阵的取值范围 变换到0~255内。 天空中的恒星在照⽚上都是⿊暗背景上的亮点,亮度是最典型的特征,如果星光⽐天光背景亮很 ,只要选取合适的阈值就可以轻松的提取 星点除去背景,将⼤于某值的像素置为255,⼩于该值的像素置为0,这个过程就叫做⼆值化(binaryzation)。这个阈值要⼩⼼选取,如果 太⼩,背景去除的不够,就会像下⾯左图那样杂乱(我为了美观没有将⼤于阈值的像素变⽩),达不到分离信号的效果 ;但如果太⼤,像右图 那样,就有丢失暗弱星点的可能。 图像上最亮的区域往往不是星光⽽是⾼能宇宙线,它们可以在瞬间让像素饱和,但形状并不规则,所以仅凭亮度是不够的,还要判断星象是 否够圆。这就需要把各个星象单独分离,⾸先要提取边缘,得出周长,⾯积,才能计算是否够圆。要划分各个星点的范围就要在图中寻找连 通的区域,好在Matlab也有现成的函数bwlabel,专门标注⼆维⼆值图像,不同的区域有了不同的编号之后,我们就可以逐个提取计算了; ⾯积已经可以直接求出了,边界的确定这⾥我⽤最基础的 “逻辑运算”(图⽰来 ⾃章毓晋⽼师的 《图像⼯程》) :将图像a全部像素右移⼀ 位,与原图求与,结果c再与原图求异,便可得到图形的左边界d,同样,在四个⽅向依次操作便可得到图形边界。 有了星点的⾯积S和对应周长L,便可以通过圆率 4pi ×S/L^2来分辨星点和宇宙线了,越接近 1的星点越圆,⽽宇宙线像素通常很少,这个 值远⼤于1。 具体程序如下 : MATLAB im=fitsread(*.fits);z=im;%读⼊fits图像,im元素为双精度 [im,x]= imread(*.TIF); z=double(im); %读⼊TIF图像,im元素为8位整型 [la,lb]=size(z); B=sum(z(:))/la/lb; % 求图像均值 sig=sum(sum((z-B).^2))/la/lb; % 求均⽅差,按理应该⽤暗场或者背景区域来做,我这⾥偷懒~ thresho=B+ 1*sig; % 选取阈值 z(x thresho )=0; z(x thresho)=255; % ⼆值化,⼩于阈值为⿊,⼤于则取 ⽩ [z_labeled,label]=bwlabel(z,4);%对找出的空⽩区域进⾏标记 %下⾯循环依次求取个空⽩区域的中⼼,⾯积,周长,圆率 for i= 1:label z_i=(z_labeled==i); [a,b]=find(z_i== 1); cand(i,1)=round((max (a)+min(a))/2); cand(i,2)=round((max (b)+min(b))/2); %⼏何中⼼坐标 cand(i,3)=sum(z_i(:));%统计⾯积 z_i1=[zeros(1,lb);z_i(1:la- 1,:)];% 向四个⽅向平移求边界 z_i2=[z_i(2:la,:);zeros(1,lb)]; z_i3=[zeros(la,1),z_i(:,1:lb- 1)]; z_i4=[z_i(:,2:lb),zeros(la,1)]; cand(i,4)=sum(sum(z_i-(z_i1z_i2z_i3z_i4)));%

文档评论(0)

1亿VIP精品文档

相关文档