Android:将灰度转换为二值图像

Android:将灰度转换为二值图像,android,bitmap,binary,grayscale,Android,Bitmap,Binary,Grayscale,我已经完成了获取灰度值,但我不知道如何使用函数将灰度转换为二值图像。请帮助我,这里是我的功能代码: public Bitmap toBinary(Bitmap bmpOriginal) { int width, height, threshold; height = bmpOriginal.getHeight(); width = bmpOriginal.getWidth(); threshold = 127; final Bitmap bmpBinary

我已经完成了获取灰度值,但我不知道如何使用函数将灰度转换为二值图像。请帮助我,这里是我的功能代码:

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;
}
公共位图toBinary(位图bmpOriginal){
整数宽度、高度、阈值;
高度=bmpOriginal.getHeight();
宽度=bmpOriginal.getWidth();
阈值=127;
最终位图bmpBinary=null;
对于(int x=0;x
以下是我的完整代码:

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;
}

}
公共类MainActivity扩展活动{
图像视图img;
按钮btn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将imageview转换为位图
img=(ImageView)findViewById(R.id.imageView1);
BitmapDrawable drawable=(BitmapDrawable)img.getDrawable();
最终位图imgbitmap=drawable.getBitmap();
btn.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//将位图转换为灰度
位图imgnew;
imgnew=总体比例(imgbitmap);
//转换成二进制
imgnew=托比纳里(imgnew);
//将位图转换为imageview
图像视图imgbit;
imgbit=(ImageView)findViewById(R.id.imageView2);
imgbit.setImageBitmap(imgnew);
}
});
}
公共位图toGrayscale(位图bmpOriginal){
int宽度、高度;
高度=bmpOriginal.getHeight();
宽度=bmpOriginal.getWidth();
位图bmpGrayscale=Bitmap.createBitmap(宽度、高度、Bitmap.Config.RGB_565);
画布c=新画布(bmpGrayscale);
油漆=新油漆();
ColorMatrix cm=新的ColorMatrix();
cm.设定饱和度(0);
ColorMatrixColorFilter f=新的ColorMatrixColorFilter(厘米);
油漆。设置颜色过滤器(f);
c、 drawBitmap(bmpOriginal,0,0,paint);
返回bmpGrayscale;
}
公共位图toBinary(位图bmpOriginal){
整数宽度、高度、阈值;
高度=bmpOriginal.getHeight();
宽度=bmpOriginal.getWidth();
阈值=127;
最终位图bmpBinary=null;
对于(int x=0;x
首先,您会得到一个NullReferenceException,因为bmpBinary为NULL
第二,要得到一种颜色的香奈儿,你可以使用int-red=Color.red(像素)
第三,使用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;
}

首先,因为bmpBinary为NULL,所以您得到一个NullReferenceException
第二,要得到一种颜色的香奈儿,你可以使用int-red=Color.red(像素)
第三,使用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;
}

请告诉我你所说的二进制图像是什么意思…调用你的函数的结果是什么?你怎么了@GopalRao,我想他说的是黑白图像,但只有黑白,没有灰色的细微差别。@GopalRao我指的是黑白图像,只有0和1的值。@gahfy我想要的结果是二进制图像的位图值,请帮助我,我的项目是制作一个android应用程序来识别叶子,现在你的函数的结果是什么?请告诉我你所说的二进制图像是什么意思…调用你的函数的结果是什么?你怎么了@GopalRao,我想他说的是黑白图像,但只有黑白,没有灰色的细微差别。@GopalRao我指的是黑白图像,只有0和1的值。@gahfy我想要的结果是二进制图像的位图值,请帮助我,我的项目是制作一个android应用程序到叶子识别,现在你的功能的结果是什么?