인공지능으로 추출한 주름의 level을 측정하기 위한 코드를 작성함
private int analyzeWrinkle() {
Bitmap m_bitmap = getFilteredBitmap(img1);
int width_origin = m_bitmap.getWidth();
int height_origin = m_bitmap.getHeight();
int width_new = 256;
int height_new = 256;
Matrix matrix = new Matrix();
float width_scale = ((float) width_new / width_origin);
float height_scale = ((float) height_new / height_origin);
matrix.postScale(width_scale, height_scale);
Bitmap bitmap_resized = Bitmap.createBitmap(m_bitmap, 0, 0, width_origin, height_origin, matrix, true);
ByteArrayOutputStream stream_output = new ByteArrayOutputStream();
bitmap_resized.compress(Bitmap.CompressFormat.PNG, 100, stream_output);
Log.d("wrinkle", String.valueOf(bitmap_resized.getWidth()));
Log.d("wrinkle", String.valueOf(bitmap_resized.getHeight()));
//이미지 예측 시작
Tensor input_tensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap_resized, TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);
Tensor output_tensor = m_module.forward(IValue.from(input_tensor)).toTensor();
float[] output_array = output_tensor.getDataAsFloatArray();
Bitmap bitmap_predict = Bitmap.createBitmap(bitmap_resized.getWidth(), bitmap_resized.getHeight(), Bitmap.Config.ARGB_8888);
float[][] temp_array = new float[256][256];
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 256; j++) {
temp_array[i][j] = output_array[(j * 256) + i];
if (temp_array[i][j] > 0.15f) {
bitmap_predict.setPixel(i, j, Color.rgb(0xff, 0xff, 0xff));
} else {
bitmap_predict.setPixel(i, j, Color.rgb(0x00, 0x00, 0x00));
}
}
}
int output=extract_wrinkle(bitmap_predict);
return output;
}
//필터링된 사진에서 검은 픽셀 개수 카운팅
private int extract_wrinkle(Bitmap bitmap_01){
int black_pixel=0;
int[] mPixels=new int[bitmap_01.getWidth()*bitmap_01.getHeight()];
bitmap_01.getPixels(mPixels,0,bitmap_01.getWidth(),0,0,bitmap_01.getWidth(),bitmap_01.getHeight());
for(int i=0,max=mPixels.length;i<max;i++){
int rgb=mPixels[i];
int r=(rgb>>16)&0xFF;
int g=(rgb>>8)&0xFF;
int b=rgb&0xFF;
if(r==0 &&g==0 &&b==0){
black_pixel++;
}
}
Log.d("검정색 픽셀 수 = "," "+ black_pixel);
//단계 설정
int level=11;
int level_thd=5400;
int level_min=0;
for(int i=0;i<11;i++)
{
if(i==0) {
level_min=-1;
}
else{
level_min=level_thd*i;
}
if((level_min<black_pixel) && (black_pixel<=level_thd*(i+1))){
level=i;
break;
}
}
return level;
}
다음과 같이 이미지를 256 x 256 의 픽셀로 분리 한 후에 검은색 픽셀 개수를 카운팅 하여 level을 측정한다.
주름 모공 유분기 추출하는 방식은 같으며 각 값의 범위에 따라 level이 나눠진다