This program supports the Image processing micon car production kit (M-S348).
Dependencies: GR-PEACH_video mbed
image_process.cpp@0:00b6f7454ada, 2018-10-30 (annotated)
- Committer:
- TetsuyaKonno
- Date:
- Tue Oct 30 09:06:30 2018 +0000
- Revision:
- 0:00b6f7454ada
New program file
Who changed what in which revision?
User | Revision | Line number | New 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 | //------------------------------------------------------------------// |