void BPFlow::TRW_S(int count) { int k=count%2; if (k==0) //forward update for(int i=0;i<Height;i++) for(int j=0;j<Width;j++) { for(int l=0;l<2;l++) { UpdateDualMessage(j,i,l); UpdateSpatialMessage(j,i,l,0); UpdateSpatialMessage(j,i,l,2); } } else // backward upate for(int i=Height-1;i>=0;i--) for(int j=Width-1;j>=0;j--) { for(int l=0;l<2;l++) { UpdateDualMessage(j,i,l); UpdateSpatialMessage(j,i,l,1); UpdateSpatialMessage(j,i,l,3); } } }
void BPFlow::BP_S(int count) { //forward update if (count % 4 < 2) { for(int i = 0; i < Height; i++) { for(int j = 0;j < Width; j++) { // this pixel is not on current layers if (!pMask1[j + i * Width]) continue; UpdateSpatialMessage(j, i, 0); UpdateSpatialMessage(j, i, 2); } } } // backward upate else { for(int i = Height - 1; i >= 0; i--) { for(int j = Width - 1; j >= 0; j--) { // this pixel is not on current layers if (!pMask1[j + i * Width]) continue; UpdateSpatialMessage(j, i, 1); UpdateSpatialMessage(j, i, 3); } } } }
//------------------------------------------------------------------------------------------------ // bipartite message update //------------------------------------------------------------------------------------------------ void BPFlow::Bipartite(int count) { // loop over vx and vy planes to update the message within each grid for (int k=0; k<2; k++) for (int i=0; i<Height; i++) for (int j=0; j<Width; j++) { // the bipartite update if (count%2==0 && (i+j)%2==k) // the even count continue; if (count%2==1 && (i+j)%2==1-k) // the odd count continue; //------------------------------------------------------------------------------------------------ // update the message from (j,i,k) to the neighbors on the same plane //------------------------------------------------------------------------------------------------ // the encoding of the direction // 0: left to right // 1: right to left // 2: top down // 3: bottom up for (int direction = 0; direction<4; direction++) UpdateSpatialMessage(j,i,k,direction); //----------------------------------------------------------------------------------------------------- // update the message from (j,i,k) to the dual node (j,i,1-k) //----------------------------------------------------------------------------------------------------- if(count%4<2) UpdateDualMessage(j,i,k); } }
void BPFlow::BP_S(int count) { int k=count%2; if (count%4<2) //forward update for(int i=0;i<Height;i++) for(int j=0;j<Width;j++) { UpdateSpatialMessage(j,i,k,0); UpdateSpatialMessage(j,i,k,2); if(count%8<4) UpdateDualMessage(j,i,k); } else // backward upate for(int i=Height-1;i>=0;i--) for(int j=Width-1;j>=0;j--) { UpdateSpatialMessage(j,i,k,1); UpdateSpatialMessage(j,i,k,3); if(count%8<4) UpdateDualMessage(j,i,k); } }