OpenCV之图像处理(二) 加载、修改、保存图像

加载图像(用cv::imread)
修改图像 (cv::cvtColor) 一个颜色空间转换到另一个颜色空间,颜色空间,肉眼看到的图像,其实是由很多单色组成 rgb  crcb hsv HLS 颜色空间
    把图像从一个彩色空间转换到另外一个色彩空间,有三个参数,第一个参数表示源图像、第二参数表示色彩空间转换之后的图像、第三个参数表示源和目标色彩空间如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等
保存图像(cv::imwrite)
    只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
    保存PNG格式的时候可以保存透明通道的图片
    可以指定压缩参数

RGB颜色空间的通道不是单一通道,有些颜色空间是单一通道。    实际上,三通道RGB的图像的顺序是 BGR

代码

windows:
    #include <opencv2\opencv.hpp>
    #include <iostream>
    using namespace cv;
    void main(int argc, char ** argv)
    {
        /*
            IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
            IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来
            IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来,默认       3通道没有 alpha
        */
        Mat src = imread("D:/opencv/images/test1.png", IMREAD_COLOR);//读取图片,OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
        if (src.empty())
        {
            printf("could not load image...\n");
            return;
        }
        namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);//创建窗口,自动大小
        imshow("test opencv setup", src);//显示图片,这个也会创建一个窗口,如果这个winname与上面窗口的winname不一致,会导致有两个窗口

        //第二个窗口显示转换了颜色空间的图片
        namedWindow("output windows", CV_WINDOW_AUTOSIZE);
        Mat output;
        //cvtColor(src, output, CV_BGR2GRAY);//RGB图像转换成灰度图,实际上,三通道RGB的图像的顺序是 BGR,所以 CV_BGR2GRAY 是BGR开头
        //cvtColor(src, output, CV_BGR2HLS);//RGB图像转换成HLS颜色空间(专调亮度?),色相(H)、亮度(L)、饱和度(S)。 OpenCV提供转换的颜色空间还有其他很多,待研究..
        cvtColor(src, output, CV_BGR2HSV);//RGB图像转换成HSV颜色空间(专调饱和度?),色调(色相)(H),饱和度(S),明度(亮度)(V)
        imshow("output windows", output);//显示第二个图片
        //保存图片
        imwrite(getCVImagesPath("images_write/test1.tif"), output);//保存的图片的格式由给的字符串决定,给png就是png,jpg就是jpg,tif就是tif,write的结果:png比jpg大,tif几乎是原图大小
        waitKey(0);//一检查到键盘活动就关闭,参数delay如果传0表示阻塞等待键盘事件,传大于0表示只阻塞等待多少毫秒,键盘无响应返回-1
    }



android:
    @BindView(R.id.iv_opencv1_2_origin) ImageView mOriginIv;
    @BindView(R.id.iv_opencv1_2_convert) ImageView mConvertIv;
    private Bitmap mOriginBmp;
    private Bitmap mConvertBmp;
    private Mat mOriginMat = new Mat();
    private Mat mConvertMat = new Mat();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cv1_2);
        mUnbinder = ButterKnife.bind(this);

        mOriginBmp = CV310Utils.getBitmapFromAssets(this, "opencv/test1.png");
        mConvertBmp = Bitmap.createBitmap(mOriginBmp.getWidth(), mOriginBmp.getHeight(), Bitmap.Config.RGB_565);
        mOriginIv.setImageBitmap(mOriginBmp);
        Utils.bitmapToMat(mOriginBmp, mOriginMat);
    }

    /*颜色空间转换*/
    private void convertColor(int code) {
        Imgproc.cvtColor(mOriginMat, mConvertMat, code);//mConvertMat对象输出图像的内存是自动分配的
        Utils.matToBitmap(mConvertMat, mConvertBmp);
        mConvertIv.setImageBitmap(mConvertBmp);
    }

    /*保存转换颜色空间后的mat图像到sdcard*/
    private void imwrite(String fileName) {
        String path = SDCardUtils.createNewFile(SDCardStoragePath.DEFAULT_OPENCV_SAVE_PATH, fileName).getAbsolutePath();
        boolean is = Imgcodecs.imwrite(path, mConvertMat);//mConvertMat没有数据的时候,不会写入,返回false   若 path 文件不存在也会返回false
        LogUtils.d("mydebug---", "is="+is+",path="+path);
    }

    @OnClick({R.id.btn_opencv1_2_convert_gray, R.id.btn_opencv1_2_convert_hls, R.id.btn_opencv1_2_convert_hsv, R.id.btn_opencv1_2_write_png,
            R.id.btn_opencv1_2_write_jpg, R.id.btn_opencv1_2_write_tif})
    void click(View view) {
        switch (view.getId()) {
            case R.id.btn_opencv1_2_convert_gray:
                convertColor(Imgproc.COLOR_BGR2GRAY);//RGB图像转换成灰度图,实际上,三通道RGB的图像的顺序是 BGR,所以 COLOR_BGR2GRAY 是BGR开头
                break;
            case R.id.btn_opencv1_2_convert_hls:
                convertColor(Imgproc.COLOR_BGR2HLS);//RGB图像转换成HLS颜色空间(专调亮度?),色相(H)、亮度(L)、饱和度(S)。 OpenCV提供转换的颜色空间还有其他很多,待研究..
                break;
            case R.id.btn_opencv1_2_convert_hsv:
                convertColor(Imgproc.COLOR_BGR2HSV);//RGB图像转换成HSV颜色空间(专调饱和度?),色调(色相)(H),饱和度(S),明度(亮度)(V)
                break;
            case R.id.btn_opencv1_2_write_png:
                imwrite("test1.png");//保存的图片的格式由给的字符串决定,给png就是png,jpg就是jpg,tif就是tif,write的结果:png比jpg大,tif几乎是原图大小
                break;
            case R.id.btn_opencv1_2_write_jpg:
                imwrite("test1.jpg");
                break;
            case R.id.btn_opencv1_2_write_tif:
                imwrite("test1.tif");//tif手机上不支持?
                break;
        }
    }

截图

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/80858355