www.pudn.com > roadextr.rar > WMlib.cpp
#include "stdafx.h" #include "valdef.h" #include#include #include #include #include "WMlib.h" #include "imgp2.h" #include "imgp.h" #include "bline.h" #include "strline.h" //#include "FFT0.h" #include "canny.h" /* //////////////////////////////////////////////////////////// get a N*N iamge window from RR Row (block row No) and CC Col (block col No.) of a large image /////////////////////////////////////////////////////////////// */ //void GetImgWinNN(BYTE *pucI,int nRow,int nCol, // BYTE *pucD,int N,int RR,int CC) //{ // int m,n; // for(m=0;m =nRow|| // CC*N+n<0 || CC*N+n >=nCol) // *(pucD+ m*N+n) = 128; // else // *(pucD+ m*N+n) = *(pucI+(RR*N+m)*nCol+CC*N+n); // } // } //} ///* //////////////////////////////////////////////////////// // put a N*N image window to RR Row (block row No) and // CC Col (block col No.) of a large image ///////////////////////////////////////////////////////////// //*/ //void PutImgWinNN(BYTE *pucI,int nRow,int nCol, // BYTE *pucD,int N,int RR,int CC) //{ // int m,n; // for(m=0;m =nRow|| // CC*N+n<0 || CC*N+n >=nCol) // continue; // *(pucI+(RR*N+m)*nCol+CC*N+n) = *(pucD+ m*N+n); // } // } //} // //void GetImgWinNN_2(BYTE *pucI,int nRow,int nCol, // BYTE *pucD,int N,int RR,int CC) //{ // int m,n; // for(m=0;m =nRow|| // CC+n<0 || CC+n >=nCol) // *(pucD+ m*N+n) = 128; // else // *(pucD+ m*N+n) = *(pucI+(RR+m)*nCol+CC+n); // } // } //} ///* //////////////////////////////////////////////////////// // put a N*N image window to RR start row and // CC Col start column of a large image ///////////////////////////////////////////////////////////// //*/ //void PutImgWinNN_2(BYTE *pucI,int nRow,int nCol, // BYTE *pucD,int N,int RR,int CC) //{ // int m,n; // for(m=0;m =nRow|| // CC+n<0 || CC+n >=nCol) // continue; // *(pucI+(RR+m)*nCol+CC+n) = *(pucD+ m*N+n); // } // } //} // ///* //////////////////////////////////////// // DCT : Directly using the equation //input: // pucI, nN ----- //output: // pfDCT ----- // Date: 24-Feb 2002 ///////////////////////////////////////////// //*/ //void DCT(BYTE *pucI,float *pfDCT,int nN) //{ // int u,v,x,y; // float sum,fu,fv,*pfu,*pfv,s; // pfu = new float[nN]; // pfv = new float[nN]; // // for(u=0;u =nKeySize) ? r%nKeySize : r; // bytK = *(pbytKey+k); // bytR = bytD ^ bytK; // // if(bytR > bytDataSize-1) // bytR = bytR % bytDataSize; // *(pbytOutput+r) = bytR; // ////// judge is there repeated R // bRep = false; // for(m=0;m 0 && ((int)bytR - *(pbytOutput+r-1) < 55 && // (int)bytR-*(pbytOutput+r-1) > -55) ) // bRep = true; // } // if(!bRep) // break; // } // if(bRep) // *(pbytOutput+r) = BYTE(r); // } // for(r=0;r 255 || nCol > 255 ) // return false; // // BYTE pbytRow[256],pbytCol[256],*pbytKey2; // int r,c,rr,cc; // // pbytKey2 = new BYTE[nKeySize]; // PRSGenAlgo_0((BYTE)nRow,pbytKey,nKeySize,pbytRow); ///// random generating row // // for(r=0;r pfDCT[5+(2*n+1)] ) || // (pucBits[n]==1 && pfDCT[5+(2*n)] < pfDCT[5+(2*n+1)] ) ) ///// exchange 1, 2 coeff of FFT // { // vv = pfDCT[5+(2*n+1)]; // pfDCT[5+(2*n+1)] = pfDCT[5+(2*n)]; // pfDCT[5+(2*n)] = vv; // } //*/ ///* if( pucBits[n]==0 && *(pI+n*INFO_EMBD_UNIT) > *(pI+n*INFO_EMBD_UNIT+1) || // pucBits[n]==1 && *(pI+n*INFO_EMBD_UNIT) < *(pI+n*INFO_EMBD_UNIT+1)) // { // vb = *(pI+n*INFO_EMBD_UNIT+1); // *(pI+n*INFO_EMBD_UNIT+1) = *(pI+n*INFO_EMBD_UNIT); // *(pI+n*INFO_EMBD_UNIT) = vb; // } //*/ ///* // Gray1D_DCT(pI+n*8,8,pfDCT); ///////// do DCT // for(i=0;i<8;i++) ///// Quantilization // pnDCT_Q[i] = (int)(pfDCT[i] / nQt[i]); // for(i=0;i<4;i++) // { // switch (pucBits[n*4+i]) // { // case 0: // pnDCT_Q[i+1] = pfDCT[i+1]* nQt[i+1]; // break; // case 1: // pfDCT[i+1] = pfDCT[i+1] * nQt[i+1] + nQt[i+1]/2; // break; // } // } // for(i=5;i<8;i++) ///// Quantilization // pnDCT_Q[i] = (int)(pfDCT[i] * nQt[i]); //*/ // Gray1D_DCT(pI+n*INFO_EMBD_UNIT,INFO_EMBD_UNIT,pfDCT); ///////// do DCT // pfDCT[1]/=4; pfDCT[2]/=4; // if( (pucBits[n]==0 && pfDCT[1] > pfDCT[2] ) || // (pucBits[n]==1 && pfDCT[1] < pfDCT[2] ) ) ///// exchange 1, 2 coeff of FFT // { // vv = pfDCT[2]; // pfDCT[2] = pfDCT[1]; // pfDCT[1] = vv; // } // if(pfDCT[1] >= pfDCT[2] && pfDCT[1] - pfDCT[2] < 4) // { pfDCT[1]+=2.0; pfDCT[2]-=2.0; // } // if(pfDCT[1] <= pfDCT[2] && pfDCT[2] - pfDCT[1] < 4) // { pfDCT[2]+=2.0; pfDCT[1]-=2.0; // } // pfDCT[1]*=4; pfDCT[2]*=4; // ///* // for(i=0;i<8;i++) ///// Quantilization!!!! // pnDCT_Q[i] = (int)(pfDCT[i]) / nQt[i]; // // ////// embedding 1 Bit // u = pnDCT_Q[1] + 255; // if(pucLUT[u] != pucBits[n]) // pnDCT_Q[1]+=3; // // for(i=0;i<8;i++) ///// Anti - Quantilization!!!! // pfDCT[i] = pnDCT_Q[i] * nQt[i]; //*/ // Reverse_1D_DCT_Gray(pI+n*INFO_EMBD_UNIT,INFO_EMBD_UNIT,pfDCT); ////// inverse DCT // // } //// Reverse_1D_DCT_Gray(pI,INFO_EMBD_UNIT*nBitsC,pfDCT); ////// inverse DCT //} ///* ////////////////////////////// // /////////////////////////////////////// //*/ //void ExtractBit_1D_FT(BYTE *pucBits,int nBitsC, // float *pfR,float *pfI,BYTE *pI) //{ // int n,i,pnDCT_Q[8],u,uu; // float pfFT_M[8],pfDCT[512]; // static int nQt[] = {1,6,6,6,6,1,1,1}; // BYTE pucLUT[512]; ///// look-up-table // // ///////// Genertae The Look-Up-Table // for(i=0;i<512;i++) // pucLUT[i] = i%2==0?0:1; // //// Gray1D_DCT(pI,nBitsC*INFO_EMBD_UNIT,pfDCT); ///////// do DCT // for(n=0;n maxp) // maxp = p; // } // TRACE("bc = %d, p = %f\n",nBitsSelC,maxp); ///* // for(nn=0;nn dfMaxCoeff) // { // dfMaxCoeff = pp; // for(nn=0;nn 10 && nnn< 32 && maxp < 0.9)|| // (nnn>=32 && nnn < 64 && maxp < 0.8 )|| // (nnn>=64 && nnn < 128 && maxp < 0.7 )|| // (nnn>=128 && nnn< 256 && maxp < 0.55 )) // maxp = 0.0; // if(nnn<=10) // return 0; // return maxp; ///* // ////// reverse detect the WM // for(mm=lsSeg.nPtC-1;mm>=nBitsC*INFO_EMBD_UNIT;mm--) // { // for(m=0;m dfMaxCoeff) // { // dfMaxCoeff = pp; // for(nn=0;nn 2*G) // if(*(pucI+nY*nCol+nX) & 1 == 1) // return 1; // else // return 0; //} // ///* ////////////////////////////////////////////////////////////////////////////////////// // Extract bits and return Max correlation between Wateramrk bits and detected bits // pucOrI,nRow,nCol ----- original image // pucBinI -------------- binary image containing single-pixel-width lines // pucWMBits ---- Known water mark bits //output: // pucDetBits,nBitsC ----- Detected bits (hold a MAX correlation with origianl watermark signal) //return: // max correlation coefficient //Date: 28-Feb 2002 //////////////////////////////////////////////////////////////////////////////////////////// //*/ //double ExtrBitsInLines_SpDomain(BYTE *pucOrI,int nRow,int nCol, // BYTE *pucBinI,BYTE *pucWMBits, // BYTE *pucDetBits,int nBitsC) //{ // int r,c,rr,cc,k,kk,m,n,nEndFg, // nEnd2Fg,nFg2,nC,nCurveC,x0,y0,mm,nn,MaxLen; // unsigned char *pucI,*pucI2,pucN8[8]; // LineSeg lsSeg; // nPOINT ppntNPix[8]; // double dfMaxCoeff,pp; // BYTE *pucBits,*pucBitsWMLen; // MaxLen = 0; // // pucBitsWMLen = new BYTE[nBitsC]; // dfMaxCoeff = -100.0; // lsSeg.pnptPxy = (nPOINT *)malloc(MAX_CURVE_POINT_COUNT*sizeof(nPOINT)); //// 10000 points // // lsSeg.nPtC=0; // n=0; // nCurveC = 0; // for(r=1;r =nRow-1||cc<1||cc>=nCol-1) // break; // if(n>=MAX_CURVE_POINT_COUNT) // break; // pucN8[7]=*(pucBinI+(rr-1)*nCol+cc+1); pucN8[6]=*(pucBinI+(rr-1)*nCol+cc); // pucN8[5]=*(pucBinI+(rr-1)*nCol+cc-1); pucN8[4]=*(pucBinI+rr*nCol+cc-1); // pucN8[3]=*(pucBinI+(rr+1)*nCol+cc-1); pucN8[2]=*(pucBinI+(rr+1)*nCol+cc); // pucN8[1]=*(pucBinI+(rr+1)*nCol+cc+1); pucN8[0]=*(pucBinI+rr*nCol+cc+1); // // ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; // ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; // ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; // ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; // nEnd2Fg=0; // nFg2=0; // for(k=0;k<8;k++) // { if(lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX // &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)/// if it's recorded point // continue; // // if(pucN8[k]!=255)//// record one point (i,j) // { nFg2=1; // lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; // lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; // // n++; // lsSeg.nPtC=n; // } // if(nFg2==1) // break; // } // // if(nFg2==0)////(is the end point!) // { if(lsSeg.nPtC > MaxLen) // MaxLen = lsSeg.nPtC; // for(m=0;m = nBitsC*INFO_EMBD_UNIT) // { ////// Extract Bits From A Curve Line // // pp = ExtractBitsFromACurveLine(pucOrI,nRow,nCol,lsSeg,pucBitsWMLen, // pucDetBits,pucWMBits,nBitsC,dfMaxCoeff); // // if(pp>dfMaxCoeff) dfMaxCoeff = pp; // } // //////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // nCurveC++; // nEndFg=1; // } // else if(nFg2==1)///else there is another neibor point! // { rr=lsSeg.pnptPxy[n-1].nY;//// get next judge point // cc=lsSeg.pnptPxy[n-1].nX; // } // if(nEndFg==1) // break; // } // } // } // // ///// then follow the closed lined (cycled line) // lsSeg.nPtC=0; // n=0; // for(r=1;r =nRow-1||cc<1||cc>=nCol-1) // break; // if(n>=MAX_CURVE_POINT_COUNT) // break; // pucN8[7]=*(pucBinI+(rr-1)*nCol+cc+1); pucN8[6]=*(pucBinI+(rr-1)*nCol+cc); // pucN8[5]=*(pucBinI+(rr-1)*nCol+cc-1); pucN8[4]=*(pucBinI+rr*nCol+cc-1); // pucN8[3]=*(pucBinI+(rr+1)*nCol+cc-1); pucN8[2]=*(pucBinI+(rr+1)*nCol+cc); // pucN8[1]=*(pucBinI+(rr+1)*nCol+cc+1); pucN8[0]=*(pucBinI+rr*nCol+cc+1); // // ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; // ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; // ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; // ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; // nEnd2Fg=0; // nFg2=0; // for(k=0;k<8;k++) // { if(lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX // &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)/// if it's recorded point // continue; // // if(pucN8[k]!=255)////record a point // { nFg2=1; // lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; // lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; // // n++; // lsSeg.nPtC=n; // } // if(nFg2==1) // break; // } // if(nFg2==0||(lsSeg.pnptPxy[n-1].nX==x0&& // lsSeg.pnptPxy[n-1].nY==y0))////(is the end point!)||back to start point // { /////////////// Extract Bits From A Curve Line // if(lsSeg.nPtC > MaxLen) // MaxLen = lsSeg.nPtC; // pp = ExtractBitsFromACurveLine(pucOrI,nRow,nCol,lsSeg,pucBitsWMLen, // pucDetBits,pucWMBits,nBitsC,dfMaxCoeff); // if(pp>dfMaxCoeff) dfMaxCoeff = pp; // ////// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // nCurveC++; // nEndFg=1; // } // else if(nFg2==1)///else there is another neibor point! // { rr=lsSeg.pnptPxy[n-1].nY;//// get next judge point // cc=lsSeg.pnptPxy[n-1].nX; // } // if(nEndFg==1) // break; // } // } // } // free(lsSeg.pnptPxy); // // TRACE("Max Len = %d\n",MaxLen); // TRACE("nCurveC = %d\n",nCurveC); // // return dfMaxCoeff; //} // ///* 1D discreate Fourier Tranformation(magnitude) // //*/ //void Gray1D_DFT(BYTE *pI,int nDataL,float *pfR,float *pfI) //{ // double sum; // float u,x,r,i,*pfRi,*pfIi; // pfRi = new float[nDataL]; // pfIi = new float[nDataL]; // for(int n=0;n pfFT_M[2] ) || // (pucBits[n]==1 && pfFT_M[1] < pfFT_M[2] ) ) ///// exchange 1, 2 coeff of FFT // { vv = pfFT_M[2]; // pfFT_M[2] = pfFT_M[1]; // pfFT_M[1] = vv; // } // if(pucBits[n]==0) // { vv = pfFT_M[2]; // pfFT_M[2] = pfFT_M[1]; // pfFT_M[1] = vv; // } //*/ // ///* // if(fabs(pfFT_M[1] - pfFT_M[2])<15.0) ///// if the two coeffs is very close // { // if(pucBits[n]==0) // pfFT_M[1] = pfFT_M[2]; // // pfFT_M[2] = pfFT_M[1] + 15.0; // else // pfFT_M[1] = pfFT_M[2] + 25.0; // } //*/ // // /* // int mm,m,nn,x0,y0,x1,y1; // double pp; // BYTE *pucBits; // pucBits = new BYTE[lsSeg.nPtC]; // // for(mm=0;mm dfMaxCoeff) // { // dfMaxCoeff = pp; // for(nn=0;nn nBitsC;mm--) // { // for(nn=0;nn dfMaxCoeff) // { // dfMaxCoeff = pp; // for(nn=0;nn