1. 程式人生 > >影象處理(二)opencv處理影象二值化,灰度化等

影象處理(二)opencv處理影象二值化,灰度化等

這裡主要實現的 opencv 基於 android 對影象進行常用處理,比如說灰度化,二值化,rgb的轉換,這裡就不貼主要程式碼,只是工具程式碼。

Utils.xxx方法的使用需要在MainActivity.class中新增此方法(好像是掉用opencv,android手機首次使用需要下載):

//OpenCV庫載入並初始化成功後的回撥函式  
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {  

        @Override  
        public void onManagerConnected
(int status) { // TODO Auto-generated method stub switch (status){ case BaseLoaderCallback.SUCCESS: Log.i(TAG, "成功載入"); break; default: super.onManagerConnected(status); Log.i(TAG, "載入失敗"
); break; } } }; @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); //load OpenCV engine and init OpenCV library OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, getApplicationContext(), mLoaderCallback); Log.i(TAG, "onResume sucess load OpenCV..."
); // new Handler().postDelayed(new Runnable(){ // // @Override // public void run() { // // TODO Auto-generated method stub // procSrc2Gray(); // } // // }, 1000); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }

Utils(處理方法)

//灰度化
    public Bitmap procSrc2Gray(Bitmap bm){
       Mat rgbMat = new Mat();  
       Mat grayMat = new Mat();  
       Bitmap graybm = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);  //建立影象
       Utils.bitmapToMat(bm, rgbMat);//bitmap轉RGB,常用
       Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
       Utils.matToBitmap(grayMat, graybm);
       return graybm;
    }

//(額外附上bitmap的處理方法)灰度化
    public Bitmap bitmap2Gray(Bitmap bmSrc) {  
        // 得到圖片的長和寬  
        int width = bmSrc.getWidth();  
        int height = bmSrc.getHeight();  
        // 建立目標灰度影象  
        Bitmap bmpGray = null;  
        bmpGray = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
        // 建立畫布  
        Canvas c = new Canvas(bmpGray);  
        Paint paint = new Paint();  
        ColorMatrix cm = new ColorMatrix();  
        cm.setSaturation(0);  
        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);  
        paint.setColorFilter(f);  
        c.drawBitmap(bmSrc, 0, 0, paint);  
        return bmpGray;  
    } 
//旋轉
     public Bitmap rotaingImageView(int angle , Bitmap bitmap) {  
           //旋轉圖片 動作   
           Matrix matrix = new Matrix();
           matrix.postRotate(angle);
           // 建立新的圖片   
           Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
           return bm;
       }

 //RGB轉換            
   public Bitmap transparentImage(Bitmap bm){
       Mat rgbMat = new Mat();  
       Mat grayMat = new Mat();
       double[] data = {250,250,250,250};//data即顏色
       Bitmap graybm = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888); 
       Utils.bitmapToMat(bm, rgbMat);
       for(int i=0;i<rgbMat.rows();i++) {
              for(int j=0;j<rgbMat.cols();j++) {
               rgbMat.put(i, j, data);
              }
       }
       Utils.matToBitmap(rgbMat, graybm);
       return graybm;
   }

//(額外附上bitmap方法)RGB轉換
     public Bitmap transparentImage(Bitmap bmp) {  

/*       pixels      接收點陣圖顏色值的陣列 
         offset      寫入到pixels[]中的第一個畫素索引值 
         stride      pixels[]中的行間距個數值(必須大於等於點陣圖寬度)。可以為負數 
           x                  從點陣圖中讀取的第一個畫素的x座標值。 
         y           從點陣圖中讀取的第一個畫素的y座標值 
         width      從每一行中讀取的畫素寬度 
         height    讀取的行數              
*/          
                int m_ImageWidth, m_ImageHeigth;  
                m_ImageWidth = bmp.getWidth();  
                m_ImageHeigth = bmp.getHeight();  
                m_BmpPixel = new int[m_ImageWidth * m_ImageHeigth];  
                bmp.getPixels(m_BmpPixel, 0, m_ImageWidth, 0, 0, m_ImageWidth,  
                        m_ImageHeigth);  
                System.out.println("AAAAAAAAAAAA2");  
                for (int i = 0; i < m_ImageWidth * m_ImageHeigth; i++) {  
                    if (m_BmpPixel[i] == Color.WHITE) {  
                        m_BmpPixel[i] = Color.BLACK;  
                    }  
                }  
                System.out.println("AAAAAAAAAAAA3");  
                Bitmap pro = Bitmap.createBitmap(m_ImageWidth,m_ImageHeigth, Bitmap.Config.ARGB_8888);
                pro.setPixels(m_BmpPixel, 0, m_ImageWidth, 0, 0, m_ImageWidth,  
                        m_ImageHeigth);  
                System.out.println("AAAAAAAAAAAA4");  
                return pro;  


        }

//二值化 
/*
        名稱                  常量
    二值閾值化       Imgproc.THRESH_BINARY
    閾值化到零       Imgproc.THRESH_TOZERO 
    截斷閾值化       Imgproc.THRESH_TRUNC
    反轉二值閾值化 Imgproc.THRESH_BINARY_INV
    反轉閾值化到零 Imgproc.THRESH_TOZERO_INV    
*/
   public Bitmap changeBitmap(Bitmap bm) {
        Mat rgbMat = new Mat();  
         Mat grayMat = new Mat();  
        Utils.bitmapToMat(bm,rgbMat);
        Imgproc.threshold(rgbMat,grayMat,100,255,Imgproc.THRESH_BINARY);
        Utils.matToBitmap(grayMat,bm);
        return bm;
    }  

 //(額外附上bitmap方法)二值化
     public Bitmap gray2Binary(Bitmap graymap) {  
            //得到圖形的寬度和長度  
            int width = graymap.getWidth();  
            int height = graymap.getHeight();  
            //建立二值化影象  
            Bitmap binarymap = null;  
            binarymap = graymap.copy(Config.ARGB_8888, true);  
            //依次迴圈,對影象的畫素進行處理  
            for (int i = 0; i < width; i++) {  
                for (int j = 0; j < height; j++) {  
                    //得到當前畫素的值  
                    int col = binarymap.getPixel(i, j);  
                    //得到alpha通道的值  
                    int alpha = col & 0xFF000000;  
                    //得到影象的畫素RGB的值  
                    int red = (col & 0x00FF0000) >> 16;  
                    int green = (col & 0x0000FF00) >> 8;  
                    int blue = (col & 0x000000FF);  
                    // 用公式X = 0.3×R+0.59×G+0.11×B計算出X代替原來的RGB  
                    int gray = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11);  
                    //對影象進行二值化處理  
                    if (gray <= 95) {  
                        gray = 0;  
                    } else {  
                        gray = 255;  
                    }  
                    // 新的ARGB  
                    int newColor = alpha | (gray << 16) | (gray << 8) | gray;  
                    //設定新影象的當前畫素值  
                    binarymap.setPixel(i, j, newColor);  
                }  
            }  
            return binarymap;  
     }