www.pudn.com > roadextr.rar > imgp.cpp
#include "stdafx.h" #include "valdef.h" #include "DefValue.h" #include "imgp.h" #include#include /*//////////////////////////////////////// 经典图象处理算法集,标准c 1999.4 /////////////////////////////////////////*/ /* 线条图形短缺处理:缝隙连接 */ void ConnectGap(unsigned char *pucImg,int nRow,int nCol,int nLen) { int ix,iy,gx,gy,leng,crn,k,gray,x1,y1,x2,y2,s,t,xd,yd,xx,yy; int naname,ddmin,dd,n[10],xmin,ymin,m1,m2; unsigned char *oi; oi=(unsigned char *)malloc(nRow*nCol*sizeof(unsigned char)); if(!oi) return; for(iy=0;iy 0) { *(oi+iy*nCol+ix)=10; continue; } if(*(oi+(iy+1)*nCol+ix)>0) { *(oi+iy*nCol+ix)=20; continue; } if(*(oi+(iy+1)*nCol+ix+1)>0) { *(oi+iy*nCol+ix)=30; continue; } if(*(oi+(iy)*nCol+ix+1)>0) { *(oi+iy*nCol+ix)=40; continue; } if(*(oi+(iy-1)*nCol+ix+1)>0) { *(oi+iy*nCol+ix)=50; continue; } if(*(oi+(iy-1)*nCol+ix)>0) { *(oi+iy*nCol+ix)=60; continue; } if(*(oi+(iy-1)*nCol+ix-1)>0) { *(oi+iy*nCol+ix)=70; continue; } if(*(oi+(iy)*nCol+ix-1)>0) { *(oi+iy*nCol+ix)=80; continue; } } /* fill the gap */ do { t=0; for(iy=0;iy =10) { m1=*(oi+iy*nCol+ix); y1=iy; x1=ix; iy=nRow+1; ix=nCol+1; t=1; continue; } } if(t==0) break; if(t==1) { s=0; for(iy=y1;iy<=y1+nLen;y1++) { if(iy<0||iy>=nRow) continue; for(ix=x1-nLen;ix<=x1+nLen;ix++) { if(ix<0||ix>=nCol) continue; if(*(oi+iy*nCol+ix)<10) continue; m2=*(oi+iy*nCol+ix); y2=iy; x2=ix; if(y1<=y2&&x1<=x2) naname=1; else naname=2; if(naname==2) { if((m1==40||m1==50||m1==60) &&(m2==80||m2==10||m2==20)) { s=1; iy=y1+nLen+1; ix=x1+nLen+1; continue; } if((m1==60||m1==70||m1==80) &&(m2==20||m2==30||m2==40)) { s=1; iy=y1+nLen+1; ix=x1+nLen+1; continue; } if((m1==40||m1==50||m1==60) &&(m2==80||m2==10||m2==20)) { s=1; iy=y1+nLen+1; ix=x1+nLen+1; continue; } } if(s==1) { *(oi+y1*nCol+x2)=2; *(oi+y2*nCol+x2)=2; do { ddmin=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2); ymin=y1; xmin=x1; for(yd=-1;yd<=1;yd++) for(xd=-1;xd<=1;xd++) { if(yd==0&&xd==0) continue; yy=y1+yd; xx=x1+xd; dd=(yy-y2)*(yy-y2)+(xx-x2)*(xx-x2); if(dd 2); } } } } }while(1); for(iy=0;iy 0) *(pucImg+iy*nCol+ix)=0; else if(*(oi+iy*nCol+ix)==0) *(pucImg+iy*nCol+ix)=255; } free(oi); } /* Hough transformation for circle detection */ //int HoughElipse(unsigned char *pucImg,int nRow,int nCol) /* */ int HoughCircle(unsigned char *pucImg,int nRow,int nCol, int nX0Max,int nX0Min,int nY0Max,int nY0Min, int nMaxR,int nMinR,int *pOutput,float fE) { long x,y,nRCMax,nXYMax,x0,y0,r; long XCMax,YCMax; int *pnX0Y0R,VV; long v; XCMax=nX0Max-nX0Min; YCMax=nY0Max-nY0Min; nRCMax=nMaxR-nMinR; pnX0Y0R=(int *)malloc(XCMax*YCMax*nRCMax*sizeof(int)); if(!pnX0Y0R) return -1; for(v=0;v =-fE) *(pnX0Y0R+y0*(XCMax*nRCMax)+x0*nRCMax+r)+=1; } } } } VV=0; for(y0=0;y0 VV) { VV=*(pnX0Y0R+y0*(XCMax*nRCMax)+x0*nRCMax+r); *(pOutput+0)=y0+nY0Min; *(pOutput+1)=x0+nX0Min; *(pOutput+2)=r+nMinR; } } } } free(pnX0Y0R); return 1; } /* 简单阈值二值化 */ void BinByThresh(unsigned char *pucImg,int nRow,int nCol,int nThresh) { int r,c; for(r=0;r nThresh) // if(*(pucImg+r*nCol+c)>nThresh/*-10&& // *(pucImg+r*nCol+c) 0 && nTh < nMaxGray-1 // && ( plHist[nTh] >= plHist[nTh-1] && plHist[nTh] >= plHist[nTh+1])) { lNoudo1 = 0,lNoudo2 = 0; lGasosu1 = 0,lGasosu2 = 0; for(r=0;r =nTh) { lGasosu2++; lNoudo2+=*(pucImg+r*nCol+c); } } if(lGasosu1>0) dfMean1 = (double)lNoudo1/lGasosu1; else dfMean1 = 0.0; if(lGasosu2>0) dfMean2 = (double)lNoudo2/lGasosu2; else dfMean2 = 0.0; pdfBunsan[nTh] = (double)lGasosu1*lGasosu2*(dfMean1-dfMean2)*(dfMean1-dfMean2); } } /* 求方差最大阈值 */ dfBMax = pdfBunsan[0]; nThresh = 0; for(nTh=1;nTh<=nMaxGray;nTh++) { if(dfBMax nThresh) *(pucImg+r*nCol+c) = 255; else *(pucImg+r*nCol+c) = 0; } TRACE("T = %d\n",nThresh); return nThresh; } /* 灰度级变换:(gray value( [Za,Zb] )extend to [Z1,Z2]) */ void GrayTrans(unsigned char *pucImg,int nRow,int nCol,int nZa,int nZb,int nZ1,int nZ2) { float fZba; int r,c; /* get the scale coefficient */ fZba = (float)(nZ2-nZ1)/(nZa-nZb); for(r=0;r nZb) *(pucImg+r*nCol+c) = nZ2; else *(pucImg+r*nCol+c) = (unsigned char)(fZba*(*(pucImg+r*nCol+c)-nZa)+nZ1); } } } /* 灰度分布的规范化:指定灰度图的均值与标准差(fE,fSigma) */ void Gray(unsigned char *pucImg,int nRow,int nCol,float fE,float fSigma) { float fE0,fBusan,fSbs,fGij,fSigma0; fE0 = fBusan = 0.0; int r,c; for(r=0;r nE) { free(pucI); return -1; } } while(nLv0<=nLevelC-1) { nSa0 = 9999; nSum = 0; for(nLv1=nLvls;nLv1<256;nLv1++) { nSum+=nHist[nLv1]; nSa1 = abs(nE-nSum); if(nSa1>nSa0) { nUpper[nLv0] = nLv1-1; nLv0++; nLvls = nLv1; break; } if(nLv1==255) { nUpper[nLv0] = nLv1; nLv0++; break; } nSa0 = nSa1; } } for(r=0;r 0)|| (*(pnII+r*nCol+c+1)<0&&*(pnII+r*nCol+c-1)>0)|| (*(pnII+(r-1)*nCol+c)<0&&*(pnII+(r+1)*nCol+c)>0)|| (*(pnII+(r+1)*nCol+c+1)<0&&*(pnII+(r-1)*nCol+c-1)>0))/*&& abs(*(pnII+r*nCol+c))>100*/) *(pucImg+r*nCol+c) =0; else *(pucImg+r*nCol+c) = 255; } /* for(r=0;r abs((double)nDD2))? abs((double)nDD1) : abs((double)nDD2)); break; } } for(r=0;r abs((double)nDD2))? abs((double)nDD1) : abs((double)nDD2)); break; } } for(r=0;r abs((double)nDD2))? abs((double)nDD1) : abs((double)nDD2)); break; } } for(r=0;r nRow) { do { dy-=nRow; }while(dy>nRow); } for(ix=0;ix nCol) { do { dx-=nCol; }while(dx>nCol); } gray1=*(pucI+iy*nCol+ix); gray2=*(pucT+dy*nCol+dx); cv+=(float)gray1*gray2; } } return cv; } /* 计算非周期卷积 */ float Convol2(unsigned char *pucI,double *pucT,int nRow,int nCol,int xz,int yz) { int ix,iy,dx,dy,gray1,gray2,gx,gy; float cv; cv=0.0; for(iy=0;iy =nRow) continue; for(ix=0;ix =nCol) continue; gray1=*(pucI+iy*nCol+ix); gray2=(int)*(pucT+dy*nCol+dx); cv+=(float)gray1*gray2; } } return cv; } void GetCubeImg(unsigned char *pucI,int nRow,int nCol,unsigned char *pucBlk, int nW,int nH,int nX0,int nY0) { int r,c; for(r=0;r =nCol||(nY0+r)<0||(nY0+r)>=nRow) *(pucBlk+r*nW+c)=0; else *(pucBlk+r*nW+c)=*(pucI+(nY0+r)*nCol+(nX0+c)); } } void GetExtRim(unsigned char *pucImg,int nRow,int nCol) { int ix,iy,gx,gy; int yup,ydown,xleft,xright,grey; yup = nRow; ydown = 0; xleft = nCol; xright = 0; for(iy=0;iy ydown) ydown = iy; if(ix xright) xright = ix; } for(iy=0;iy =xleft-1&&ix<=xright+1)|| (iy==ydown+1&&ix>=xleft-1&&ix<=xright+1)|| (iy>=yup-1&&ix==xleft-1&&iy<=ydown+1)|| (iy>=yup-1&&iy<=ydown+1&&ix==xright+1)) *(pucImg+iy*nCol+ix) = 0; else *(pucImg+iy*nCol+ix) = 255; } } void SetWhiteBorder(unsigned char *pucImg,int nRow,int nCol,int nBdW) { int i,j; for(i=0;i nRow-nBdW-1||j nCol-nBdW-1) *(pucImg+i*nCol+j) = 255; } } } /* extract straight line by y = k*x + b input: pucI,nRow,nCol ---- binary image in which there is single width curve fAngleUnit,fBUnit ----- interval of K (angle with degree unit!!!!) and B pfAngleRg,pfBRg ------- value range of angle and b output: *pfK,*pfB ------------- output of K and B return (maxium unit value in the accumulator) */ float HoughT_Str_kb(BYTE *pucI,int nRow,int nCol, float *pfK,float *pfB,float fAngleUnit, float fBUnit,float *pfAngleRg,float *pfBRg) { int *pnAcc,nAccK,nAccB,kk,bb,n,k,b,i,j; float x,y; nAccK = (int)((pfAngleRg[1] - pfAngleRg[0])/fAngleUnit)+2; nAccB = (int)((pfBRg[1] - pfBRg[0])/fBUnit)+2; pnAcc = new int[nAccK*nAccB]; for(n=0;n =nAccB-1||b<=0) continue; *(pnAcc+b*nAccK+kk) = *(pnAcc+b*nAccK+kk) + 1; //// } } } int maxB,maxK,max; //// find maxium unit for(bb=0;bb =nRow) continue; for(j=0;j =nCol) continue; *(pucImg+r*nCol+c) = 0; } } } /* */ void K_MeanClassify(BYTE *pucImg,int nRow,int nCol,int *pnPeaks,int nC, int nMin,int nMax,int *pnMeans) { int pnNewMeans[100],i,g,d,pnN[100],n,min,N,Fg; double pdfSum[100]; for(i=0;i 1) Fg = 0; } for(n=0;n 60?120-d:d; // vs = (double)(int)(*(pucS+i))/45.0; // vs = vs?1?1:vs; if(n==0||d 1) Fg = 0; } for(n=0;n =0;i--) { for(j=nCol-2;j>=0;j--) { if(*(psnRegions+i*nCol+j+1)==l || *(psnRegions+(i+1)*nCol+j-1)==l || *(psnRegions+(i+1)*nCol+j)==l || *(psnRegions+(i+1)*nCol+j+1)==l) { *(psnRegions+i*nCol+j) = l; chg2 = 1; continue; } } } if(chg1==0) continue; goto propa; } return lmax; }