2013-11-30 4 views
0

i hava сделано с получением значения оттенков серого, но я не знаю, как использовать функцию для преобразования оттенков серого в бинарное изображение. Пожалуйста, помогите мне, вот мой код функции:Android: преобразование оттенков серого в двоичное изображение

public Bitmap toBinary(Bitmap bmpOriginal) { 
    int width, height, threshold; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 
    threshold = 127; 
    final Bitmap bmpBinary = null; 

    for(int x = 0; x < width; ++x) { 
     for(int y = 0; y < height; ++y) { 
      // get one pixel color 
      int pixel = bmpOriginal.getPixel(x, y); 

      //get grayscale value 
      int gray = (int)(pixel & 0xFF); 

      //get binary value 
      if(gray < threshold){ 
       bmpBinary.setPixel(x, y, 0); 
      } else{ 
       bmpBinary.setPixel(x, y, 255); 
      } 

     } 
    } 
    return bmpBinary; 
} 

здесь мой полный код:

public class MainActivity extends Activity { 

    ImageView img; 
    Button btn; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //convert imageview to bitmap 
     img =(ImageView) findViewById(R.id.imageView1); 
     BitmapDrawable drawable = (BitmapDrawable) img.getDrawable(); 
     final Bitmap imgbitmap = drawable.getBitmap(); 


     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //convert bitmap to grayscale 
       Bitmap imgnew; 
       imgnew = toGrayscale(imgbitmap);  
       //convert to binary 
imgnew = toBinary(imgnew); 

       //convert bitmap to imageview 
       ImageView imgbit; 
       imgbit = (ImageView) findViewById(R.id.imageView2); 
       imgbit.setImageBitmap(imgnew); 
      } 
     }); 

    } 

    public Bitmap toGrayscale(Bitmap bmpOriginal){   
     int width, height; 
     height = bmpOriginal.getHeight(); 
     width = bmpOriginal.getWidth();  

     Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
     Canvas c = new Canvas(bmpGrayscale); 
     Paint paint = new Paint(); 
     ColorMatrix cm = new ColorMatrix(); 
     cm.setSaturation(0); 
     ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
     paint.setColorFilter(f); 
     c.drawBitmap(bmpOriginal, 0, 0, paint); 
     return bmpGrayscale; 
    } 


public Bitmap toBinary(Bitmap bmpOriginal) { 
    int width, height, threshold; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 
    threshold = 127; 
    final Bitmap bmpBinary = null; 

    for(int x = 0; x < width; ++x) { 
     for(int y = 0; y < height; ++y) { 
      // get one pixel color 
      int pixel = bmpOriginal.getPixel(x, y); 

      //get grayscale value 
      int gray = (int)(pixel & 0xFF); 

      //get binary value 
      if(gray < threshold){ 
       bmpBinary.setPixel(x, y, 0); 
      } else{ 
       bmpBinary.setPixel(x, y, 255); 
      } 

     } 
    } 
    return bmpBinary; 
} 

} 
+0

pls подскажите, что вы подразумеваете под бинарным изображением ... –

+0

Каков результат вызова вашей функции? Что не так для вас? @GopalRao, я думаю, он говорит о черно-белом изображении, но только черно-белом, без серого оттенка. – gahfy

+0

@GopalRao Я имею в виду черно-белое изображение только с 0 и 1 значения. –

ответ

5

Во-первых, вы получаете NullReferenceException потому что bmpBinary является NULL.
Во-вторых, чтобы получить один цветной Chanel, вы можете использовать int red = Color.red (pixel);
В-третьих, для установки белого пикселя используйте bmpBinary.setPixel (x, y, 0xFFFFFFFF);

Я изменил код немного:

public Bitmap toBinary(Bitmap bmpOriginal) { 
    int width, height, threshold; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 
    threshold = 127; 
    Bitmap bmpBinary = Bitmap.createBitmap(bmpOriginal); 

    for(int x = 0; x < width; ++x) { 
     for(int y = 0; y < height; ++y) { 
      // get one pixel color 
      int pixel = bmpOriginal.getPixel(x, y); 
      int red = Color.red(pixel); 

      //get binary value 
      if(red < threshold){ 
       bmpBinary.setPixel(x, y, 0xFF000000); 
      } else{ 
       bmpBinary.setPixel(x, y, 0xFFFFFFFF); 
      } 

     } 
    } 
    return bmpBinary; 
} 

еще лучший способ это не использовать только значение одного цвета Chanel, но взвешенное среднее красного, зеленого и синего цветов, например:

int gray = (int)(red * 0.3 + green * 0.59 + blue * 0.11); 
+0

Большое вам спасибо: D, который отлично работает ... –

Смежные вопросы