如何利用openCV作灰度圖片

將彩色圖片變成灰度圖片的兩種方式:ios

1.使用openCV 算法

2.使用IOS系統自帶的開發庫實現設計模式

3.實現架構佈局(設計模式:策略模式)架構

第一:使用openCV框架

1.下載openCV框架:http://opencv.org/佈局

2.導入項目spa

3.建立渲染灰度圖片類:架構設計

#import "ImageUtils.h"設計

//第一步導入OpenCV 頭文件code

#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();

    

    //第二步:顏色空間的上下文(保存圖像的數據信息)

    //參數一:指向圖像的內存地址

    //參數2、三:圖像的寬、高

    //參數四:像素位數(顏色空間,例如;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

{}

 

 

//

相關文章
相關標籤/搜索