java - 灰度到二进制?

标签 java android eclipse binary grayscale

我正在尝试将灰度图像转换为二进制图像。我的代码将位图转换为灰度,但我不知道如何将该图像转换为二进制文件。这是我目前拥有的代码。请帮我!!!谢谢!

package com.example.vanderbilt;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.os.Bundle;
import android.widget.ImageView;

import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

公共(public)类二进制扩展 Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.binary);
    ImageView img = (ImageView) findViewById(R.id.ivBinary);

    /*
     * Bitmap bmp = BitmapFactory.decodeResource(getResources(),
     * R.drawable.sample4); Bitmap bmpGray = toGrayscale(bmp);
     * img.setImageBitmap(bmpGray);
     */

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),
            R.drawable.sample4);
    Mat imgToProcess = Utils.bitmapToMat(bmp);

    for (int i = 0; i < imgToProcess.height(); i++) {
        for (int j = 0; j < imgToProcess.width(); j++) {
            double y = 0.3 * imgToProcess.get(i, j)[0] + 0.59
                    * imgToProcess.get(i, j)[1] + 0.11
                    * imgToProcess.get(i, j)[2];
            imgToProcess.put(i, j, new double[] { y, y, y, 255 });
        }
    }

    int widthM, heightM, rowsM, colsM;
    colsM = imgToProcess.cols();
    rowsM = imgToProcess.rows();
    heightM = imgToProcess.height();
    widthM = imgToProcess.width();

    Bitmap bmpOut = Bitmap.createBitmap(imgToProcess.cols(),
            imgToProcess.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(imgToProcess, bmpOut);
    img.setImageBitmap(bmpOut);

}

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

最佳答案

我过去用 android 做过一些图像过滤,对于 ThresholdingFilter 我使用了这段代码:

public class ThresholdingFilter {

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  METHODS  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Methods that apply a Thresholding Effect on image
     * 
     * @param imageIn the input image
     * @param threshold Integer - value (0-255)  prefered value (threshold = 125)
     * @return
     */ 

    public static AndroidImage process(AndroidImage imageIn, int threshold) {

        // The Resulting image
        AndroidImage imageOut;

        // Initiate the Output image
        imageOut = new AndroidImage(imageIn.getImage());

        // Do Threshold process
        for(int y=0; y<imageIn.getHeight(); y++){
            for(int x=0; x<imageIn.getWidth(); x++){

                if(imageOut.getRComponent(x,y) < threshold){
                    imageOut.setPixelColor(x, y, 0,0,0);
                }
                else{
                    imageOut.setPixelColor(x, y, 255,255,255);
                }               
            }
        }   

        // Return final image
        return imageOut;
    }

}

AndroidImage 是 Android 位图的自定义包装类

public class AndroidImage {

     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ATTRIBUTES  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    // Original bitmap image
    private Bitmap image;

    // Format of the image (jpg/png)
    private String formatName;

    /** Dimensions of image */

    // Width of the image
    private int width;

    // Height of the image
    private int height;

    // RGB Array Color
    protected int[] colorArray;

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  METHODS  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  

    /**
     * Constructor
     * 
     * @param img the Bitmap from which we create our AndroidImage Object 
     */

    public AndroidImage(Bitmap img){        
        this.image =  img;
        this.formatName = "jpg";
        this.width = img.getWidth();
        this.height = img.getHeight();
        updateColorArray();
    }


    /**
     * Method to reset the image to a solid color
     * 
     * @param color - color to reset the entire image to
     */

    public void clearImage(int color){
        for(int y=0; y<height; y++){
            for(int x=0; x<width; x++){
                image.setPixel(x, y, color);
            }
        }
    }


    /**
     * Method to set color array for image - called on initialization by constructor
     * 
     * 
     */

    private void updateColorArray(){
        colorArray = new int[width * height];
        image.getPixels(colorArray, 0, width, 0, 0, width, height);
        int r, g, b;
        for (int y = 0; y < height; y++){
            for (int x = 0; x < width; x++){
                int index = y * width + x;
                r = (colorArray[index] >> 16) & 0xff;
                g = (colorArray[index] >> 8) & 0xff;
                b = colorArray[index] & 0xff;
                colorArray[index] = 0xff000000 | (r << 16) | (g << 8) | b;
            }
        }
    }


    /**
     * Method to set the color of a specific pixel
     * 
     * @param x
     * @param y
     * @param color
     */

    public void setPixelColor(int x, int y, int color){
        colorArray[((y*image.getWidth()+x))] = color;
        image.setPixel(x, y, color);
    }

    /**
     * Method to get the color of a specified pixel
     * 
     * @param x
     * @param y
     * @return color
     */

    public int getPixelColor(int x, int y){
        return colorArray[y*width+x];
    }

    /**
     * Method to set the color of a specified pixel from an RGB combination
     * 
     * @param x
     * @param y
     * @param c0
     * @param c1
     * @param c2
     */

    public void setPixelColor(int x, int y, int c0, int c1, int c2){
        colorArray[((y*image.getWidth()+x))] = (255 << 24) + (c0 << 16) + (c1 << 8) + c2;
        image.setPixel(x, y, colorArray[((y*image.getWidth()+x))]);
    }

    /**
     * Method to get the RED color of a specified pixel 
     *  
     * @param x
     * @param y
     * @return color of R component
     */

    public int getRComponent(int x, int y){
        return (getColorArray()[((y*width+x))]& 0x00FF0000) >>> 16;
    }


    /**
     * Method to get the GREEN color of a specified pixel
     *  
     * @param x
     * @param y
     * @return color of G component
     */

    public int getGComponent(int x, int y){
        return (getColorArray()[((y*width+x))]& 0x0000FF00) >>> 8;
    }


    /**
     * Method to get the BLUE color of a specified pixel
     *  
     * @param x
     * @param y
     * @return color of B component
     */

    public int getBComponent(int x, int y){
        return (getColorArray()[((y*width+x))] & 0x000000FF);
    }



    /**
     * Method to rotate an image by the specified number of degrees
     * 
     * @param rotateDegrees
     */

    public void rotate (int rotateDegrees){
        Matrix mtx = new Matrix();
        mtx.postRotate(rotateDegrees);
        image = Bitmap.createBitmap(image, 0, 0, width, height, mtx, true);
        width = image.getWidth();
        height = image.getHeight();
        updateColorArray();
    }

     // Setters and Getters

    /**
     * @return the image
     */

    public Bitmap getImage() {
        return image;
    }

    /**
     * @param image the image to set
     */

    public void setImage(Bitmap image) {
        this.image = image;
    }

    /**
     * @return the formatName
     */

    public String getFormatName() {
        return formatName;
    }

    /**
     * @param formatName the formatName to set
     */

    public void setFormatName(String formatName) {
        this.formatName = formatName;
    }


    /**
     * @return the width
     */

    public int getWidth() {
        return width;
    }

    /**
     * @param width the width to set
     */

    public void setWidth(int width) {
        this.width = width;
    }

    /**
     * @return the height
     */

    public int getHeight() {
        return height;
    }

    /**
     * @param height the height to set
     */

    public void setHeight(int height) {
        this.height = height;
    }

    /**
     * @return the colorArray
     */

    public int[] getColorArray() {
        return colorArray;
    }

    /**
     * @param colorArray the colorArray to set
     */

    public void setColorArray(int[] colorArray) {
        this.colorArray = colorArray;
    }

}

希望对你有帮助

关于java - 灰度到二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11227994/

相关文章:

java - 使用比较器对数组列表进行排序

java - 粒子发射器 libgdx Java

android - 在 Android 中获取 double 变量的指南百分比值

java - Eclipse 2018-09 不会编译 Java 11 源代码;认为低于1.7

java - 清理搞砸了我的 Android 项目

java - 无法在 Nativescript 和外部设备 SDK 25、Android 7.1.2 中使用 SQLite

Java从数组中删除重复项?

java - 如何从列表中获取对象中的字符串值?

android - 如何在 Android 中将 PDF 转换为 HTML 页面?

java - Google map v2 通过 Google Play 获取我的位置