This program supports the Image processing micon car production kit (M-S348).

Dependencies:   GR-PEACH_video mbed

Committer:
TetsuyaKonno
Date:
Tue Oct 30 09:06:30 2018 +0000
Revision:
0:00b6f7454ada
New program file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TetsuyaKonno 0:00b6f7454ada 1 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 2 //Supported MCU: RZ/A1H
TetsuyaKonno 0:00b6f7454ada 3 //File Contents: Image Processing API ( Source file )
TetsuyaKonno 0:00b6f7454ada 4 //Version number: Ver.1.00
TetsuyaKonno 0:00b6f7454ada 5 //Date: 2018.10.30
TetsuyaKonno 0:00b6f7454ada 6 //Copyright: Renesas Electronics Corporation
TetsuyaKonno 0:00b6f7454ada 7 // Hitachi Document Solutions Co., Ltd.
TetsuyaKonno 0:00b6f7454ada 8 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 9
TetsuyaKonno 0:00b6f7454ada 10 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 11 //Include
TetsuyaKonno 0:00b6f7454ada 12 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 13 #include <math.h>
TetsuyaKonno 0:00b6f7454ada 14 #include "mbed.h"
TetsuyaKonno 0:00b6f7454ada 15 #include "image_process.h"
TetsuyaKonno 0:00b6f7454ada 16
TetsuyaKonno 0:00b6f7454ada 17 /*******************************/
TetsuyaKonno 0:00b6f7454ada 18 /* Function Map */
TetsuyaKonno 0:00b6f7454ada 19 /********************************
TetsuyaKonno 0:00b6f7454ada 20 * ImageCopy
TetsuyaKonno 0:00b6f7454ada 21 * Extraction_Brightness
TetsuyaKonno 0:00b6f7454ada 22 * ImageReduction
TetsuyaKonno 0:00b6f7454ada 23 * Binarization
TetsuyaKonno 0:00b6f7454ada 24 * Image_part_Extraction
TetsuyaKonno 0:00b6f7454ada 25 * Standard_Deviation
TetsuyaKonno 0:00b6f7454ada 26 * Covariance
TetsuyaKonno 0:00b6f7454ada 27 * Judgement_ImageMatching
TetsuyaKonno 0:00b6f7454ada 28 * PatternMatching_process
TetsuyaKonno 0:00b6f7454ada 29 ********************************/
TetsuyaKonno 0:00b6f7454ada 30
TetsuyaKonno 0:00b6f7454ada 31 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 32 // Image process functions
TetsuyaKonno 0:00b6f7454ada 33 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 34 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 35 // ImageCopy function
TetsuyaKonno 0:00b6f7454ada 36 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 37 void ImageCopy( unsigned char *BuffAddrIn, int HW, int VW, unsigned char *BuffAddrOut, int Frame )
TetsuyaKonno 0:00b6f7454ada 38 {
TetsuyaKonno 0:00b6f7454ada 39 static int counter = 0;
TetsuyaKonno 0:00b6f7454ada 40 static int X, Y;
TetsuyaKonno 0:00b6f7454ada 41 int HW_T;//HW Twice
TetsuyaKonno 0:00b6f7454ada 42
TetsuyaKonno 0:00b6f7454ada 43 HW_T = HW + HW;
TetsuyaKonno 0:00b6f7454ada 44
TetsuyaKonno 0:00b6f7454ada 45 switch( counter++ ) {
TetsuyaKonno 0:00b6f7454ada 46 case 0:
TetsuyaKonno 0:00b6f7454ada 47 // Top or Bottom field
TetsuyaKonno 0:00b6f7454ada 48 for( Y = Frame; Y < ( VW / 2 ); Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 49 for( X = 0; X < HW_T; X++ ){
TetsuyaKonno 0:00b6f7454ada 50 BuffAddrOut[ ( Y * HW_T ) + X ] = BuffAddrIn[ ( Y * HW_T ) + X ];
TetsuyaKonno 0:00b6f7454ada 51 }
TetsuyaKonno 0:00b6f7454ada 52 }
TetsuyaKonno 0:00b6f7454ada 53 break;
TetsuyaKonno 0:00b6f7454ada 54 case 1:
TetsuyaKonno 0:00b6f7454ada 55 // Top or Bottom field
TetsuyaKonno 0:00b6f7454ada 56 for( ; Y < VW; Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 57 for( X = 0; X < HW_T; X++ ){
TetsuyaKonno 0:00b6f7454ada 58 BuffAddrOut[ ( Y * HW_T ) + X ] = BuffAddrIn[ ( Y * HW_T ) + X ];
TetsuyaKonno 0:00b6f7454ada 59 }
TetsuyaKonno 0:00b6f7454ada 60 }
TetsuyaKonno 0:00b6f7454ada 61 //Frame Change
TetsuyaKonno 0:00b6f7454ada 62 if( Frame == 0 ) Frame = 1;
TetsuyaKonno 0:00b6f7454ada 63 else Frame = 0;
TetsuyaKonno 0:00b6f7454ada 64 for( Y = Frame; Y < VW; Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 65 for( X = 0; X < HW_T; X+=2 ){
TetsuyaKonno 0:00b6f7454ada 66 BuffAddrOut[ ( Y * HW_T ) + ( X + 0 ) ] = 0;
TetsuyaKonno 0:00b6f7454ada 67 BuffAddrOut[ ( Y * HW_T ) + ( X + 1 ) ] = 128;
TetsuyaKonno 0:00b6f7454ada 68 }
TetsuyaKonno 0:00b6f7454ada 69 }
TetsuyaKonno 0:00b6f7454ada 70 counter = 0;
TetsuyaKonno 0:00b6f7454ada 71 break;
TetsuyaKonno 0:00b6f7454ada 72 default:
TetsuyaKonno 0:00b6f7454ada 73 break;
TetsuyaKonno 0:00b6f7454ada 74 }
TetsuyaKonno 0:00b6f7454ada 75 }
TetsuyaKonno 0:00b6f7454ada 76
TetsuyaKonno 0:00b6f7454ada 77 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 78 // Extraction Brightness function
TetsuyaKonno 0:00b6f7454ada 79 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 80 void Extraction_Brightness( unsigned char *BuffAddrIn, int HW, int VW, unsigned char *BuffAddrOut, int Frame )
TetsuyaKonno 0:00b6f7454ada 81 {
TetsuyaKonno 0:00b6f7454ada 82 static int conter = 0;
TetsuyaKonno 0:00b6f7454ada 83
TetsuyaKonno 0:00b6f7454ada 84 int X, Y;
TetsuyaKonno 0:00b6f7454ada 85 int Px;
TetsuyaKonno 0:00b6f7454ada 86 int HW_T;//HW Twice
TetsuyaKonno 0:00b6f7454ada 87
TetsuyaKonno 0:00b6f7454ada 88 HW_T = HW + HW;
TetsuyaKonno 0:00b6f7454ada 89
TetsuyaKonno 0:00b6f7454ada 90 switch( conter++ ) {
TetsuyaKonno 0:00b6f7454ada 91 case 0:
TetsuyaKonno 0:00b6f7454ada 92 //Pixel Interpolation ( Top or Bottom )
TetsuyaKonno 0:00b6f7454ada 93 for( Y = Frame; Y < ( VW / 2 ); Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 94 for( X = 0, Px = 0; X < HW_T; X+=2, Px++ ){
TetsuyaKonno 0:00b6f7454ada 95 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrIn[ ( Y * HW_T ) + X ];
TetsuyaKonno 0:00b6f7454ada 96 }
TetsuyaKonno 0:00b6f7454ada 97 }
TetsuyaKonno 0:00b6f7454ada 98 //Frame Change
TetsuyaKonno 0:00b6f7454ada 99 if( Frame == 0 ) Frame = 1;
TetsuyaKonno 0:00b6f7454ada 100 else Frame = 0;
TetsuyaKonno 0:00b6f7454ada 101 //Bilinear Interpolation Method
TetsuyaKonno 0:00b6f7454ada 102 for( Y = Frame; Y < ( VW / 2 ); Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 103 for( X = 0, Px = 0; X < HW_T; X+=2, Px++ ){
TetsuyaKonno 0:00b6f7454ada 104 if( Y <= 0 ) {
TetsuyaKonno 0:00b6f7454ada 105 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrOut[ ( (Y+1) * HW ) + Px ];
TetsuyaKonno 0:00b6f7454ada 106 } else if( ( ( VW / 2 ) - 1 ) > Y && Y > 0 ) {
TetsuyaKonno 0:00b6f7454ada 107 BuffAddrOut[ ( Y * HW ) + Px ] = ( BuffAddrOut[ ( (Y-1) * HW ) + Px ] * (double)0.5 ) + ( BuffAddrOut[ ( (Y+1) * HW ) + Px ] * (double)0.5 );
TetsuyaKonno 0:00b6f7454ada 108 } else if( Y >= ( ( VW / 2 ) - 1 ) ) {
TetsuyaKonno 0:00b6f7454ada 109 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrOut[ ( (Y-1) * HW ) + Px ];
TetsuyaKonno 0:00b6f7454ada 110 }
TetsuyaKonno 0:00b6f7454ada 111 }
TetsuyaKonno 0:00b6f7454ada 112 }
TetsuyaKonno 0:00b6f7454ada 113 break;
TetsuyaKonno 0:00b6f7454ada 114 case 1:
TetsuyaKonno 0:00b6f7454ada 115 //Pixel Interpolation ( Top or Bottom )
TetsuyaKonno 0:00b6f7454ada 116 for( Y = ( VW / 2 ) + Frame; Y < VW; Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 117 for( X = 0, Px = 0; X < HW_T; X+=2, Px++ ){
TetsuyaKonno 0:00b6f7454ada 118 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrIn[ ( Y * HW_T ) + X ];
TetsuyaKonno 0:00b6f7454ada 119 }
TetsuyaKonno 0:00b6f7454ada 120 }
TetsuyaKonno 0:00b6f7454ada 121 //Frame Change
TetsuyaKonno 0:00b6f7454ada 122 if( Frame == 0 ) Frame = 1;
TetsuyaKonno 0:00b6f7454ada 123 else Frame = 0;
TetsuyaKonno 0:00b6f7454ada 124 //Bilinear Interpolation Method
TetsuyaKonno 0:00b6f7454ada 125 for( Y = ( VW / 2 ) + Frame; Y < VW; Y+=2 ){
TetsuyaKonno 0:00b6f7454ada 126 for( X = 0, Px = 0; X < HW_T; X+=2, Px++ ){
TetsuyaKonno 0:00b6f7454ada 127 if( Y <= 0 ) {
TetsuyaKonno 0:00b6f7454ada 128 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrOut[ ( (Y+1) * HW ) + Px ];
TetsuyaKonno 0:00b6f7454ada 129 } else if( ( VW - 1 ) > Y && Y > 0 ) {
TetsuyaKonno 0:00b6f7454ada 130 BuffAddrOut[ ( Y * HW ) + Px ] = ( BuffAddrOut[ ( (Y-1) * HW ) + Px ] * (double)0.5 ) + ( BuffAddrOut[ ( (Y+1) * HW ) + Px ] * (double)0.5 );
TetsuyaKonno 0:00b6f7454ada 131 } else if( Y >= ( VW - 1 ) ) {
TetsuyaKonno 0:00b6f7454ada 132 BuffAddrOut[ ( Y * HW ) + Px ] = BuffAddrOut[ ( (Y-1) * HW ) + Px ];
TetsuyaKonno 0:00b6f7454ada 133 }
TetsuyaKonno 0:00b6f7454ada 134 }
TetsuyaKonno 0:00b6f7454ada 135 }
TetsuyaKonno 0:00b6f7454ada 136 conter = 0;
TetsuyaKonno 0:00b6f7454ada 137 break;
TetsuyaKonno 0:00b6f7454ada 138 default:
TetsuyaKonno 0:00b6f7454ada 139 break;
TetsuyaKonno 0:00b6f7454ada 140 }
TetsuyaKonno 0:00b6f7454ada 141 }
TetsuyaKonno 0:00b6f7454ada 142
TetsuyaKonno 0:00b6f7454ada 143 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 144 // Image Reduction function
TetsuyaKonno 0:00b6f7454ada 145 // Parcent : 0.0 - 1.0
TetsuyaKonno 0:00b6f7454ada 146 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 147 void ImageReduction( unsigned char *BuffAddrIn, int HW, int VW, unsigned char *BuffAddrOut, double Percent )
TetsuyaKonno 0:00b6f7454ada 148 {
TetsuyaKonno 0:00b6f7454ada 149 static int conter = 0;
TetsuyaKonno 0:00b6f7454ada 150 static int Y;
TetsuyaKonno 0:00b6f7454ada 151
TetsuyaKonno 0:00b6f7454ada 152 int X;
TetsuyaKonno 0:00b6f7454ada 153 int HW_N;
TetsuyaKonno 0:00b6f7454ada 154 long Nx, Ny;
TetsuyaKonno 0:00b6f7454ada 155 long NxBuff, NyBuff;
TetsuyaKonno 0:00b6f7454ada 156 unsigned int BuffAddrData;
TetsuyaKonno 0:00b6f7454ada 157 double long Sx, Sy;
TetsuyaKonno 0:00b6f7454ada 158
TetsuyaKonno 0:00b6f7454ada 159 NxBuff = -1;
TetsuyaKonno 0:00b6f7454ada 160 Sx = Sy = Percent;
TetsuyaKonno 0:00b6f7454ada 161 HW_N = HW * Percent;
TetsuyaKonno 0:00b6f7454ada 162
TetsuyaKonno 0:00b6f7454ada 163 //Under 100%
TetsuyaKonno 0:00b6f7454ada 164 if( Percent <= 1 ) {
TetsuyaKonno 0:00b6f7454ada 165 switch( conter++ ) {
TetsuyaKonno 0:00b6f7454ada 166 case 0:
TetsuyaKonno 0:00b6f7454ada 167 for( Y = 0; Y < ( VW / 2 ); Y++ ){
TetsuyaKonno 0:00b6f7454ada 168 //Affine Transformation Y-axis
TetsuyaKonno 0:00b6f7454ada 169 Ny = ( Sy * Y );
TetsuyaKonno 0:00b6f7454ada 170 for( X = 0; X < HW; X++ ){
TetsuyaKonno 0:00b6f7454ada 171 //Affine Transformation X-axis
TetsuyaKonno 0:00b6f7454ada 172 Nx = ( Sx * X );
TetsuyaKonno 0:00b6f7454ada 173 if( NxBuff == Nx ) {
TetsuyaKonno 0:00b6f7454ada 174 BuffAddrData = BuffAddrOut[ ( Ny * HW_N ) + Nx ];
TetsuyaKonno 0:00b6f7454ada 175 BuffAddrData += BuffAddrIn[ ( Y * HW ) + X ];
TetsuyaKonno 0:00b6f7454ada 176 BuffAddrData /= 2;
TetsuyaKonno 0:00b6f7454ada 177 BuffAddrOut[ ( Ny * HW_N ) + Nx ] = BuffAddrData;
TetsuyaKonno 0:00b6f7454ada 178 } else {
TetsuyaKonno 0:00b6f7454ada 179 NxBuff = Nx;
TetsuyaKonno 0:00b6f7454ada 180 BuffAddrOut[ ( Ny * HW_N ) + Nx ] = BuffAddrIn[ ( Y * HW ) + X ];
TetsuyaKonno 0:00b6f7454ada 181 }
TetsuyaKonno 0:00b6f7454ada 182 }
TetsuyaKonno 0:00b6f7454ada 183 if( NyBuff == Ny ) {
TetsuyaKonno 0:00b6f7454ada 184 for( X = 0; X < HW_N; X++ ){
TetsuyaKonno 0:00b6f7454ada 185 BuffAddrData = BuffAddrOut[ ( Ny * HW_N ) + X ];//Now line
TetsuyaKonno 0:00b6f7454ada 186 BuffAddrData += BuffAddrOut[ ( (Ny - 1) * HW_N ) + X ];//Before now line
TetsuyaKonno 0:00b6f7454ada 187 BuffAddrData /= 2;
TetsuyaKonno 0:00b6f7454ada 188 BuffAddrOut[ ( Ny * HW_N ) + X ] = BuffAddrData;
TetsuyaKonno 0:00b6f7454ada 189 }
TetsuyaKonno 0:00b6f7454ada 190 } else {
TetsuyaKonno 0:00b6f7454ada 191 NyBuff = Ny;
TetsuyaKonno 0:00b6f7454ada 192 }
TetsuyaKonno 0:00b6f7454ada 193 }
TetsuyaKonno 0:00b6f7454ada 194 break;
TetsuyaKonno 0:00b6f7454ada 195 case 1:
TetsuyaKonno 0:00b6f7454ada 196 for( ; Y < VW; Y++ ){
TetsuyaKonno 0:00b6f7454ada 197 //Affine Transformation Y-axis
TetsuyaKonno 0:00b6f7454ada 198 Ny = ( Sy * Y );
TetsuyaKonno 0:00b6f7454ada 199 for( X = 0; X < HW; X++ ){
TetsuyaKonno 0:00b6f7454ada 200 //Affine Transformation X-axis
TetsuyaKonno 0:00b6f7454ada 201 Nx = ( Sx * X );
TetsuyaKonno 0:00b6f7454ada 202 if( NxBuff == Nx ) {
TetsuyaKonno 0:00b6f7454ada 203 BuffAddrData = BuffAddrOut[ ( Ny * HW_N ) + Nx ];
TetsuyaKonno 0:00b6f7454ada 204 BuffAddrData += BuffAddrIn[ ( Y * HW ) + X ];
TetsuyaKonno 0:00b6f7454ada 205 BuffAddrData /= 2;
TetsuyaKonno 0:00b6f7454ada 206 BuffAddrOut[ ( Ny * HW_N ) + Nx ] = BuffAddrData;
TetsuyaKonno 0:00b6f7454ada 207 } else {
TetsuyaKonno 0:00b6f7454ada 208 NxBuff = Nx;
TetsuyaKonno 0:00b6f7454ada 209 BuffAddrOut[ ( Ny * HW_N ) + Nx ] = BuffAddrIn[ ( Y * HW ) + X ];
TetsuyaKonno 0:00b6f7454ada 210 }
TetsuyaKonno 0:00b6f7454ada 211 }
TetsuyaKonno 0:00b6f7454ada 212 if( NyBuff == Ny ) {
TetsuyaKonno 0:00b6f7454ada 213 for( X = 0; X < HW_N; X++ ){
TetsuyaKonno 0:00b6f7454ada 214 BuffAddrData = BuffAddrOut[ ( Ny * HW_N ) + X ];//Now line
TetsuyaKonno 0:00b6f7454ada 215 BuffAddrData += BuffAddrOut[ ( (Ny - 1) * HW_N ) + X ];//Before now line
TetsuyaKonno 0:00b6f7454ada 216 BuffAddrData /= 2;
TetsuyaKonno 0:00b6f7454ada 217 BuffAddrOut[ ( Ny * HW_N ) + X ] = BuffAddrData;
TetsuyaKonno 0:00b6f7454ada 218 }
TetsuyaKonno 0:00b6f7454ada 219 } else {
TetsuyaKonno 0:00b6f7454ada 220 NyBuff = Ny;
TetsuyaKonno 0:00b6f7454ada 221 }
TetsuyaKonno 0:00b6f7454ada 222 }
TetsuyaKonno 0:00b6f7454ada 223 conter = 0;
TetsuyaKonno 0:00b6f7454ada 224 break;
TetsuyaKonno 0:00b6f7454ada 225 default:
TetsuyaKonno 0:00b6f7454ada 226 break;
TetsuyaKonno 0:00b6f7454ada 227 }
TetsuyaKonno 0:00b6f7454ada 228 }
TetsuyaKonno 0:00b6f7454ada 229 }
TetsuyaKonno 0:00b6f7454ada 230
TetsuyaKonno 0:00b6f7454ada 231 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 232 // Binarization process Function
TetsuyaKonno 0:00b6f7454ada 233 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 234 void Binarization( unsigned char *BuffAddrIn, int HW, int VW, unsigned char *BuffAddrOut, int threshold )
TetsuyaKonno 0:00b6f7454ada 235 {
TetsuyaKonno 0:00b6f7454ada 236 int i;
TetsuyaKonno 0:00b6f7454ada 237 int items;
TetsuyaKonno 0:00b6f7454ada 238
TetsuyaKonno 0:00b6f7454ada 239 items = HW * VW;
TetsuyaKonno 0:00b6f7454ada 240
TetsuyaKonno 0:00b6f7454ada 241 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:00b6f7454ada 242 if( BuffAddrIn[i] >= threshold ) BuffAddrOut[i] = 1;
TetsuyaKonno 0:00b6f7454ada 243 else BuffAddrOut[i] = 0;
TetsuyaKonno 0:00b6f7454ada 244 }
TetsuyaKonno 0:00b6f7454ada 245 }
TetsuyaKonno 0:00b6f7454ada 246
TetsuyaKonno 0:00b6f7454ada 247 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 248 // Mark detect functions
TetsuyaKonno 0:00b6f7454ada 249 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 250 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 251 // Extract_Image
TetsuyaKonno 0:00b6f7454ada 252 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 253 void Image_part_Extraction( unsigned char *BuffAddrIn, int HW, int VW,
TetsuyaKonno 0:00b6f7454ada 254 int CutPointX, int CutPointY, unsigned char *BuffAddrOut, int Xsize, int Ysize )
TetsuyaKonno 0:00b6f7454ada 255 {
TetsuyaKonno 0:00b6f7454ada 256 int X, Y;
TetsuyaKonno 0:00b6f7454ada 257 for( Y = 0; Y < Ysize; Y++ ) {
TetsuyaKonno 0:00b6f7454ada 258 for( X = 0; X < Xsize; X++ ) {
TetsuyaKonno 0:00b6f7454ada 259 BuffAddrOut[ X + ( Y * Xsize ) ] = BuffAddrIn[ ( ( Y + CutPointY ) * HW ) + ( X + CutPointX ) ];
TetsuyaKonno 0:00b6f7454ada 260 }
TetsuyaKonno 0:00b6f7454ada 261 }
TetsuyaKonno 0:00b6f7454ada 262 }
TetsuyaKonno 0:00b6f7454ada 263
TetsuyaKonno 0:00b6f7454ada 264 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 265 // Standard deviation
TetsuyaKonno 0:00b6f7454ada 266 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 267 double Standard_Deviation( unsigned char *data, double *Devi, int Xsize, int Ysize )
TetsuyaKonno 0:00b6f7454ada 268 {
TetsuyaKonno 0:00b6f7454ada 269 int i;
TetsuyaKonno 0:00b6f7454ada 270 int items;
TetsuyaKonno 0:00b6f7454ada 271 double iRet_A, iRet_C, iRet_D;
TetsuyaKonno 0:00b6f7454ada 272
TetsuyaKonno 0:00b6f7454ada 273 items = Xsize * Ysize;
TetsuyaKonno 0:00b6f7454ada 274
TetsuyaKonno 0:00b6f7454ada 275 /* A 合計値 平均化 */
TetsuyaKonno 0:00b6f7454ada 276 iRet_A = 0;
TetsuyaKonno 0:00b6f7454ada 277 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:00b6f7454ada 278 iRet_A += data[i];
TetsuyaKonno 0:00b6f7454ada 279 }
TetsuyaKonno 0:00b6f7454ada 280 iRet_A /= items;
TetsuyaKonno 0:00b6f7454ada 281
TetsuyaKonno 0:00b6f7454ada 282 /* B 偏差値 */
TetsuyaKonno 0:00b6f7454ada 283 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:00b6f7454ada 284 Devi[i] = data[i] - iRet_A;
TetsuyaKonno 0:00b6f7454ada 285 }
TetsuyaKonno 0:00b6f7454ada 286
TetsuyaKonno 0:00b6f7454ada 287 /* C 分散 */
TetsuyaKonno 0:00b6f7454ada 288 iRet_C = 0;
TetsuyaKonno 0:00b6f7454ada 289 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:00b6f7454ada 290 iRet_C += ( Devi[i] * Devi[i] );
TetsuyaKonno 0:00b6f7454ada 291 }
TetsuyaKonno 0:00b6f7454ada 292 iRet_C /= items;
TetsuyaKonno 0:00b6f7454ada 293
TetsuyaKonno 0:00b6f7454ada 294 /* D 標準偏差 */
TetsuyaKonno 0:00b6f7454ada 295 iRet_D = sqrt( iRet_C );
TetsuyaKonno 0:00b6f7454ada 296
TetsuyaKonno 0:00b6f7454ada 297 return iRet_D;
TetsuyaKonno 0:00b6f7454ada 298 }
TetsuyaKonno 0:00b6f7454ada 299
TetsuyaKonno 0:00b6f7454ada 300 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 301 // Covariance
TetsuyaKonno 0:00b6f7454ada 302 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 303 double Covariance( double *Devi_A, double *Devi_B, int Xsize, int Ysize )
TetsuyaKonno 0:00b6f7454ada 304 {
TetsuyaKonno 0:00b6f7454ada 305 int i;
TetsuyaKonno 0:00b6f7454ada 306 int items;
TetsuyaKonno 0:00b6f7454ada 307 double iRet, iRet_buff;
TetsuyaKonno 0:00b6f7454ada 308
TetsuyaKonno 0:00b6f7454ada 309 items = Xsize * Ysize;
TetsuyaKonno 0:00b6f7454ada 310
TetsuyaKonno 0:00b6f7454ada 311 iRet = 0;
TetsuyaKonno 0:00b6f7454ada 312 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:00b6f7454ada 313 iRet_buff = Devi_A[i] * Devi_B[i];
TetsuyaKonno 0:00b6f7454ada 314 iRet += iRet_buff;
TetsuyaKonno 0:00b6f7454ada 315 }
TetsuyaKonno 0:00b6f7454ada 316 iRet /= items;
TetsuyaKonno 0:00b6f7454ada 317
TetsuyaKonno 0:00b6f7454ada 318 return iRet;
TetsuyaKonno 0:00b6f7454ada 319 }
TetsuyaKonno 0:00b6f7454ada 320
TetsuyaKonno 0:00b6f7454ada 321 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 322 // Judgement_ImageMatching
TetsuyaKonno 0:00b6f7454ada 323 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 324 int Judgement_ImageMatching( double Covari, double SDevi_A, double SDevi_B )
TetsuyaKonno 0:00b6f7454ada 325 {
TetsuyaKonno 0:00b6f7454ada 326 int iRet;
TetsuyaKonno 0:00b6f7454ada 327
TetsuyaKonno 0:00b6f7454ada 328 iRet = ( Covari * 100 ) / ( SDevi_A * SDevi_B );
TetsuyaKonno 0:00b6f7454ada 329
TetsuyaKonno 0:00b6f7454ada 330 return iRet;
TetsuyaKonno 0:00b6f7454ada 331 }
TetsuyaKonno 0:00b6f7454ada 332
TetsuyaKonno 0:00b6f7454ada 333 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 334 // Pattern Matching process
TetsuyaKonno 0:00b6f7454ada 335 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 336 void PatternMatching_process( unsigned char *BuffAddrIn, int HW, int VW,
TetsuyaKonno 0:00b6f7454ada 337 ImagePartPattern *Temp, int Xs, int Xe, int Ys, int Ye )
TetsuyaKonno 0:00b6f7454ada 338 {
TetsuyaKonno 0:00b6f7454ada 339 ImagePartPattern NowImage;
TetsuyaKonno 0:00b6f7454ada 340 volatile int x, y;
TetsuyaKonno 0:00b6f7454ada 341 volatile int retJudge;
TetsuyaKonno 0:00b6f7454ada 342 volatile double retCovari;
TetsuyaKonno 0:00b6f7454ada 343
TetsuyaKonno 0:00b6f7454ada 344 Temp->p = 0;
TetsuyaKonno 0:00b6f7454ada 345 for( y = Ys; y <= Ye; y++ ) {
TetsuyaKonno 0:00b6f7454ada 346 for( x = Xs; x <= Xe; x++ ) {
TetsuyaKonno 0:00b6f7454ada 347 Image_part_Extraction( BuffAddrIn, HW, VW, x, y, NowImage.binary, Temp->w, Temp->h );
TetsuyaKonno 0:00b6f7454ada 348 NowImage.sdevi = Standard_Deviation( NowImage.binary, NowImage.devi, Temp->w, Temp->h);
TetsuyaKonno 0:00b6f7454ada 349 retCovari = Covariance( Temp->devi, NowImage.devi, Temp->w, Temp->h );
TetsuyaKonno 0:00b6f7454ada 350 retJudge = 0;
TetsuyaKonno 0:00b6f7454ada 351 retJudge = Judgement_ImageMatching( retCovari, Temp->sdevi, NowImage.sdevi );
TetsuyaKonno 0:00b6f7454ada 352 if( 100 >= retJudge && retJudge > Temp->p ) {
TetsuyaKonno 0:00b6f7454ada 353 Temp->x = x;
TetsuyaKonno 0:00b6f7454ada 354 Temp->y = y;
TetsuyaKonno 0:00b6f7454ada 355 Temp->p = retJudge;
TetsuyaKonno 0:00b6f7454ada 356 }
TetsuyaKonno 0:00b6f7454ada 357 }
TetsuyaKonno 0:00b6f7454ada 358 }
TetsuyaKonno 0:00b6f7454ada 359 }
TetsuyaKonno 0:00b6f7454ada 360
TetsuyaKonno 0:00b6f7454ada 361 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 362 // End of file
TetsuyaKonno 0:00b6f7454ada 363 //------------------------------------------------------------------//