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

本文介绍了一个基于OpenCV的Android应用程序,用于实现图像处理功能,包括灰度化、二值化及RGB转换等。提供了详细的代码示例,展示了如何利用OpenCV库进行图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里主要实现的 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;  
     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值