#Grip 9기# 일기_1117 - [안드로이드]주름 및 모공, 유분기 level 측정

JH·2022년 12월 5일
0

인턴

목록 보기
18/25
post-thumbnail

level 측정

인공지능으로 추출한 주름의 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이 나눠진다

0개의 댓글