7 #ifndef pupilFitter_hpp
8 #define pupilFitter_hpp
10 #include <mx/improc/eigenImage.hpp>
11 #include <mx/improc/imageUtils.hpp>
12 #include <mx/improc/circleOuterpix.hpp>
13 #include <mx/improc/imageTransforms.hpp>
21 template<
typename realT>
24 mx::improc::eigenImage<realT>
m_quad;
26 mx::improc::eigenImage<realT>
m_circ;
56 int threshold( mx::improc::eigenImage<realT> & im );
58 int getQuad( mx::improc::eigenImage<realT> & quad,
59 mx::improc::eigenImage<realT> & im,
63 int putQuad( mx::improc::eigenImage<realT> & im,
64 mx::improc::eigenImage<realT> & quad,
74 int fit( mx::improc::eigenImage<realT> & im,
75 mx::improc::eigenImage<realT> & edged
82 template<
typename realT>
90 m_quad.resize(m_rows,m_cols);
91 m_circ.resize(m_rows,m_cols);
94 m_quadMag.resize(m_quad.rows()*10, m_quad.cols()*10);
95 m_circMag.resize(m_circ.rows()*10, m_circ.cols()*10);
97 m_pixs.resize(m_quadMag.rows()*m_quadMag.cols());
102 template<
typename realT>
128 if(quadNo == 1) i0 = m_rows;
129 if(quadNo == 2) j0 = m_cols;
141 template<
typename realT>
144 for(
int i =0; i< im.rows(); ++i)
146 for(
int j=0; j< im.cols(); ++j)
148 if(im(i,j) >= m_thresh) im(i,j) = 1;
156 template<
typename realT>
158 mx::improc::eigenImage<realT> & im,
163 if(im.rows() != 2*m_rows || im.cols() != 2*m_cols)
169 quadCoords(i0, j0, quadNo);
171 for(
size_t i =i0; i< i0+m_rows; ++i)
173 for(
size_t j=j0; j<j0+m_cols;++j)
175 quad(i-i0, j-j0) = im(i,j);
182 template<
typename realT>
184 mx::improc::eigenImage<realT> & quad,
188 if(im.rows() != 2*m_rows || im.cols() != 2*m_cols)
194 quadCoords(i0, j0, quadNo);
196 for(
size_t i =i0; i< i0+m_rows; ++i)
198 for(
size_t j=j0; j<j0+m_cols;++j)
200 im(i,j) = quad(i-i0, j-j0);;
207 template<
typename realT>
217 mx::improc::circleOuterpix(x0, y0, avgr0, avgx, avgy, avgr, m_circMag, m_quadMag);
224 quadCoords(i0, j0, quadNo);
235 template<
typename realT>
237 mx::improc::eigenImage<realT> & edged
240 mx::improc::eigenImage<realT> imin = im;
242 for(
int i=0; i< m_numPupils; ++i)
245 getQuad(m_quad, imin, i);
247 mx::improc::imageMagnify(m_quadMag, m_quad, mx::improc::bilinearTransform<realT>());
251 for(
size_t j=0; j < m_pixs.size(); ++j) m_pixs[j] = m_quadMag.data()[j];
253 std::sort(m_pixs.begin(), m_pixs.end());
255 m_med[i] = m_pixs[m_pupMedIndex*m_pixs.size()];
260 threshold(m_quadMag);
263 outerpix(m_avgx[i], m_avgy[i], m_avgr[i], i);
266 mx::improc::imageRebinSum( m_quad, m_quadMag,
true);
267 mx::improc::imageRebinSum( m_circ, m_circMag);
268 putQuad(im, m_quad, i);
269 putQuad(edged, m_circ, i);
Struct to perform centration and measure diameter of Pyramid pupils.
int m_numPupils
the number of pupils. Default is 4, 3 is also supported.
unsigned m_rows
[in] the size of a quad, in rows
std::vector< realT > m_pixs
int putQuad(mx::improc::eigenImage< realT > &im, mx::improc::eigenImage< realT > &quad, int quadNo)
int outerpix(float &avgx, float &avgy, float &avgr, int quadNo)
unsigned m_cols
[in] the size of a quad, in cols
int getQuad(mx::improc::eigenImage< realT > &quad, mx::improc::eigenImage< realT > &im, int quadNo)
mx::improc::eigenImage< realT > m_circMag
int setSize(unsigned rows, unsigned cols)
mx::improc::eigenImage< realT > m_quadMag
int quadCoords(size_t &i0, size_t &j0, int quadNo)
Returns the quadrant starting coordinates.
int threshold(mx::improc::eigenImage< realT > &im)
mx::improc::eigenImage< realT > m_circ
mx::improc::eigenImage< realT > m_quad
float m_pupMedIndex
the index of the illuminated pupil median in a sorted array.
int fit(mx::improc::eigenImage< realT > &im, mx::improc::eigenImage< realT > &edged)