安卓OpenCV开发(六)图片处理(1)

使用OpenCV进行图片处理(1)

基础知识可以回顾我之前写的文章:
OpenCV导入
OpenCV人脸检测
OpenCV竖屏检测
OpenCV人脸识别
OpenCV小狗识别

本文将提供一下openCv处理图片的处理,文末附上代码链接。
(1)灰度处理
(2)腐蚀操作
(3)膨胀操作
(4)高斯模糊
(5)中值滤波
(6)Canny边缘检测
(7)盲水印

效果图如下:

实现流程

本质上,安卓使用OpenCV进行图片处理,就是引入openCv的库,然后调用相关的类,进行图片的处理。下面就是所有实现的核心代码:

(1)灰度处理

    public Bitmap toGray(Bitmap source) {
        Mat src = new Mat();
        Utils.bitmapToMat(source, src);
        Mat dst = new Mat();
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
        Utils.matToBitmap(dst, source);
        src.release();
        dst.release();
        return source;
    }

(2)腐蚀操作

    public Bitmap toCorrosion(Bitmap bitmap, int width, int height) {
        //腐蚀
        Mat src = new Mat();
        Mat dst = new Mat();
        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(width, height));
        Utils.bitmapToMat(bitmap, src);
        //src:源图像
        //dst:输出图像
        //element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。
        //为此,我们需要使用函数cv :: getStructuringElement:
        Imgproc.erode(src, dst, element);
        Utils.matToBitmap(dst, bitmap);
        src.release();
        dst.release();
        return bitmap;
    }

(3)膨胀操作

    public Bitmap toDilate(Bitmap bitmap, int width, int height) {
        //膨胀
        //src:源图像
        //dst:输出图像
        //element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。
        //为此,我们需要使用函数cv :: getStructuringElement:
        Mat src = new Mat();
        Mat dst = new Mat();
        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(width, height));
        Utils.bitmapToMat(bitmap, src);
        Imgproc.dilate(src, dst, element);
        Utils.matToBitmap(dst, bitmap);
        src.release();
        dst.release();
        return bitmap;
    }

(4)高斯模糊

    public Bitmap toGaussian(Bitmap bitmap) {
        //高斯模糊
        Mat src = new Mat();
        Mat ret = new Mat();
        Utils.bitmapToMat(bitmap, src);
        // src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
        // dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
        // ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
        // sigmaX,表示高斯核函数在X方向的的标准偏差。
        // sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
        Imgproc.GaussianBlur(src, ret, new Size(77, 77), 5, 5);
        Utils.matToBitmap(ret, bitmap);
        src.release();
        ret.release();
        return bitmap;
    }

(5)中值滤波

    public Bitmap toMedianBlur(Bitmap bitmap, int ksize) {
        //中值滤波
        Mat src = new Mat();
        Mat ret = new Mat();
        Utils.bitmapToMat(bitmap, src);
        // InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
        // OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst
        // int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……
        Imgproc.medianBlur(src, ret, ksize);
        Utils.matToBitmap(ret, bitmap);
        src.release();
        ret.release();
        return bitmap;
    }

(6)Canny边缘检测

    public Bitmap CannyScan(Bitmap bitmap, int threshold1, int threshold2) {
        //边缘检测
        Mat src = new Mat();
        Utils.bitmapToMat(bitmap, src);
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);//灰度处理
        Mat ret = src.clone();
        // image  输入图像,必须是CV_8U的单通道或者三通道图像。
        // edges  输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
        // threshold1  第一个滞后阈值。
        // threshold2  第二个滞后阈值。
        Imgproc.Canny(src, ret, threshold1, threshold2);
        Utils.matToBitmap(ret, bitmap);
        src.release();
        gray.release();
        ret.release();
        return bitmap;
    }

(7)盲水印
感谢提供的思路
核心为图片进行离散傅里叶变换后,加入文字,然后再转换回来。
目前暂不支持中文

项目地址
分支dev
搜索:HomeActivity

that’s all--------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(opencv,android,opencv)