1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #define GrayScale 256 #define col MT9V03X_W #define row MT9V03X_H
uint8 OTSU(void) { uint16 i,j; uint8 img_row=row,img_col=col; uint16 histogram[GrayScale]; for(i=0; i<GrayScale; i++) histogram[i]=0; for(i=0; i<img_row; i++) for(j=0; j<img_col; j++) ++histogram[mt9v03x_image[i][j]]; uint16 minGray,maxGray; for(minGray=0;minGray<256&&histogram[minGray]==0;minGray++); for(maxGray=255;maxGray>minGray&&histogram[maxGray]==0;maxGray--); if(maxGray==minGray) return maxGray; if(maxGray==minGray+1) return minGray; uint16 PixelSum=0; for(i=minGray; i<maxGray+1; i++) PixelSum += histogram[i]; uint16 GraySum=0; for(i=minGray; i<maxGray+1; i++) GraySum += histogram[i]*i;
float w0; float w1; uint16 w0num; uint16 w1num; uint16 u0gray; uint16 u1gray; float u0; float u1; float deltaTmp=0,deltaMax=-1; uint8 th; u0gray = u1gray = w0num = w1num = 0; for(i=minGray; i<maxGray+1; i++) { w0num += histogram[i]; w1num = PixelSum-w0num; w0 = w0num*1.0/PixelSum; w1 = w1num*1.0/PixelSum; u0gray += histogram[i]*i; u1gray = GraySum-u0gray; u0 = u0gray*1.0/w0num; u1 = u1gray*1.0/w1num; deltaTmp = (float)(w0 * w1 * (u0 - u1)*(u0 - u1)); if(deltaTmp>deltaMax) { deltaMax = deltaTmp; th = i; } } return th; }
|