2012-06-27 5 views
1

Я пытаюсь преобразовать изображение в оттенках серого в двоичный файл. Код, который я преобразует растровое изображение в оттенки серого, но я теряю информацию о том, как сделать это изображение в двоичном формате. Вот код, который у меня есть. ПОЖАЛУЙСТА ПОМОГИТЕ!!! Благодаря!Оттенки серого до двоичного?

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; 

общественного класса Binary расширяет активность {

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

}

+0

Вы хотите сказать, что вам нужен пороговый алгоритм? См. Статью в [wikipedia] (http://en.wikipedia.org/wiki/Thresholding_ (image_processing)). –

+0

Да, мне нужно пороговое изображение в оттенках серого. Знаете ли вы какие-либо коды, которые я мог бы использовать? –

+0

Я использовал бы метод [otsu] (http://en.wikipedia.org/wiki/Otsu%27s_Method), чтобы выбрать лучший порог. Существует также оптимизация, когда вы разделяете изображение на 4 части, пока качество порога для каждой части не будет достаточно высоким. –

ответ

3

Я сделал некоторую фильтрацию изображения в прошлом с андроидом, для 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 - это пользовательский класс Wrapper для Android Bitmap

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

} 

Надеется, что это поможет вам

+0

Я положил первый код в свой binary.java, а для второго я создал новый класс и вставил его. Но я продолжаю получать ошибку для AndroidImage. Что мне делать? –

+1

@ Young-HunKim, какую ошибку вы получили, используйте два класса в качестве отдельного класса и назовите их на вас. используйте AsynchronouTask для фильтрации, потому что это длинная операция! и дайте мне знать, если у вас возникнут проблемы –

+0

Прямо сейчас, я использую Imgproc.threshold (imgToProcess, imgToProcess, 100, 255, Imgproc.THRESH_BINARY); в моем binary.java, но я чувствую, что это сильно ограничивает меня тем, что я могу сделать. Я заметил, что ваш код имеет гораздо больше функций. Было бы здорово, если бы вы могли пройти через мой код. Благодарю. –

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