首页 > 代码库 > 如何利用openCV做灰度图片

如何利用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

{}

 

 

//

 

如何利用openCV做灰度图片