zoukankan      html  css  js  c++  java
  • 如何利用openCV做灰度图片

    将彩色图片变成灰度图片的两种方式:

    1.使用openCV 

    2.使用IOS系统自带的开发库实现

    3.实现架构布局(设计模式:策略模式)

    第一:使用openCV

    1.下载openCV框架:http://opencv.org/

    2.导入项目

    3.创建渲染灰度图片类:

    #import "ImageUtils.h"

    //第一步导入OpenCV 头文件

    #import <opencv2/opencv.hpp>

    #import <opencv2/imgcodecs/ios.h>

    //#import <opencv2/imgproc/types_c.h>

     

    //导入命名空间支持,C++或则C语言 也可以之间改一个.m文件为.mm 文件

     

    using namespace cv;//命名空间是为了解决OC不能出现相同命名,而C++语言可以出现相同命名

     

    @implementation ImageUtils

     

    -(UIImage *)imageToGrayImage:(UIImage *)image

    {

        //image 表示源文件(图片)

        //第二步:将IOSUIImage 转为C++的图片(数据)

        Mat mat_image_Ogray;

        UIImageToMat(image, mat_image_Ogray);

        

        //第三步:将C++的彩色图片转成灰度图片

        //cvtColor:第一个参数是:源图片,第二个参数:是目标图片 第三个参数:转换类似(灰度)

        Mat mat_image_dst;

        

        cvtColor(mat_image_Ogray, mat_image_dst, COLOR_RGB2GRAY);

        

        //第四步:将灰度图片--》可显示的图片

        cvtColor(mat_image_dst, mat_image_Ogray, COLOR_GRAY2BGR);

        

        //C++的图片转成iosUIImage图片

        return MatToUIImage(mat_image_Ogray);

    }

     

    //系统方法

    -(UIImage*)systemImageToGrayImage:(UIImage*)image

    {

        NSInteger width = image.size.width;

        NSInteger height = image.size.height;

        

        //创建颜色空间(开辟一个颜色内存空间)

        //图片灰度空间(创建灰度空间)

         CGColorSpaceRef colorREF =  CGColorSpaceCreateDeviceGray();

        

        //第二步:颜色空间的上下文(保存图像的数据信息)

        //参数一:指向图像的内存地址

        //参数二、三:图像的宽、高

        //参数四:像素位数(颜色空间,例如;32位像素格式或RGB颜色空间)

        //参数五:图片每一行暂用的比特数

        //参数六:颜色空间

        //参数七:图片是否包含A(透明度)通道(ARGB四个通道)

       CGContextRef context =  CGBitmapContextCreate(nil, width, height, 8, 0, colorREF, kCGImageAlphaNone);

        //第三步:释放内存

        CGColorSpaceRelease(colorREF);

        if (context == nil) {

                   return nil;

        }

        

        //第四步:渲染图片(绘制图片)

        //参数一:图片空间上下文

        //参数二:渲染区域

        //参数三:数据源(图片源)(说白了现在是C++内存区域)

        CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);

        

        //第五步:将绘制的颜色空间转成CGImage(转成图片类型)

        CGImageRef  grayIamgeRef = CGBitmapContextCreateImage(context);

        

        //第六步:将C++图片CGIamge转成面向对象的UIIamge(ios程序认识的图片)

        

        UIImage *desImage = [UIImage imageWithCGImage:grayIamgeRef];

        //释放内存

        CGContextRelease(context);

        CGImageRelease(grayIamgeRef);

        return desImage;

    }

    @end

    3.架构设计(设计模式:策略模式)

    简单策略模式:一个类中相同的方法,可以单独定义,便于扩展,将我们的算法进行分离

    第一步定义:策略模式(面向协议开发)

    #import <UIKit/UIKit.h>

    //策略协议(面向协议开发)

    @protocol Strategy <NSObject>

     //算法设计

    -(UIImage*)imageToGrayImage:(UIImage*)image;

    @end

     

    第二步:创建遵守协议的类

    (1)系统方法类

    import <Foundation/Foundation.h>

    #import "Strategy.h"

     @interface SystemStrategy : NSObject<Strategy>

    @end

    .m

    导入系统的实现方法

    implementation SystemStrategy

     //系统自带的方法

    -(UIImage*)imageToGrayImage:(UIImage *)image

    {}

     

    (2)创建OpenCV策略类

    #import <Foundation/Foundation.h>

    #import "Strategy.h"

    @interface OpenCVStrategy : NSObject<Strategy>

     @end

    //导入OpenCV

    #import <opencv2/opencv.hpp>

    #import <opencv2/imgcodecs/ios.h>

     //导入命名空间支持,C++或则C语言 也可以之间改一个.m文件为.mm 文件

     using namespace cv;//命名空间是为了解决OC不能出现相同命名,而C++语言可以出现相同命名

     

    @implementation OpenCVStrategy

     -(UIImage *)imageToGrayImage:(UIImage *)image

    {}

     

     

    //

  • 相关阅读:
    zookeeper C API
    《accelerated c++》第九章---设计类
    redis memcache 比较
    redis 学习记录
    php memcache 使用学习
    php新手需要注意的高效率编程
    linux常用命令
    curl和file_get_contents 区别以及各自的优劣
    php序列化问题
    socket编程 123
  • 原文地址:https://www.cnblogs.com/meixian/p/6383889.html
Copyright © 2011-2022 走看看