图像处理(二)opencv处理图像二值化,灰度化等

来源:互联网 发布:java获取svn文件列表 编辑:程序博客网 时间:2024/06/07 10:52

这里主要实现的 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;       }  
0 0
原创粉丝点击