QPoint FMSegViewPrivate::point_to_index(QPoint pt) { if (m_target_rect.width()==0) return QPoint(0,0); if (m_target_rect.height()==0) return QPoint(0,0); float pctx=((float)pt.x()-m_target_rect.x())/(m_target_rect.width()); float pcty=((float)pt.y()-m_target_rect.y())/(m_target_rect.height()); int retx=(int)(pctx*m_array.N1()); int rety=(int)(pcty*m_array.N2()); if (retx<0) retx=0; if (retx>=m_array.N1()) retx=m_array.N1()-1; if (rety<0) rety=0; if (rety>=m_array.N2()) rety=m_array.N2()-1; return QPoint(retx,/*m_array.N2()-1-*/rety); }
Array2D FMSegViewPrivate::compute_median_filter(const Array2D &array,int radius) { Array2D ret; ret.allocate(array.N1(),array.N2()); for (int y=0; y<array.N2(); y++) for (int x=0; x<array.N1(); x++) { QList<float> list; for (int dy=-radius; dy<=radius; dy++) for (int dx=-radius; dx<=radius; dx++) { list << array.getValue(x+dx,y+dy); } qSort(list); ret.setValue(list[list.count()/2],x,y); } return ret; }
Array2D FMSegViewPrivate::compute_mask_boundary(const Array2D &mask) { Array2D B; int N1=mask.N1(); int N2=mask.N2(); B.allocate(N1,N2); for (int y=0; y<N2; y++) for (int x=0; x<N1; x++) { if (mask.getValue(x,y)) { for (int dy=-1; dy<=1; dy++) for (int dx=-1; dx<=1; dx++) { if ((!mask.getValue(x+dx,y+dy))&&(!B.getValue(x,y))) { B.setValue(1,x,y); } } } } return B; }