OpenCV 在iOS平台实现马赛克效果

一、马赛克效果

马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。

opencv2框架下载地址 https://opencv.org/ 

以下OpenCV程序实现马赛克效果,

1、导入opencv2.framework框架添加头文件

#import <UIKit/UIKit.h>

//核心类

#import <opencv2/opencv.hpp>

//对iOS支持类

#import <opencv2/imgcodecs/ios.h>


//矩阵

//导入矩阵帮助类

#import <opencv2/highgui.hpp>

#import <opencv2/core/types.hpp>


//导入C++命名空间

using namespace cv;

@interface Unitil: NSObject

+(UIImage *)MosaicImage:(UIImage *)image level:(int)level;

@end

2、实现MosaicImage方法

+(UIImage *)MosaicImage:(UIImage *)image level:(int)level{

    

    Mat mat_image_src;

    //转化为opencv 图片

    UIImageToMat(image, mat_image_src);

    

    int width = mat_image_src.cols;

    int height = mat_image_src.rows;


    

    //图片转化rgba转成rgb 这个地方必须实现也是需要注意的地方

    Mat mat_image_dst;

    cvtColor(mat_image_src, mat_image_dst,CV_RGBA2RGB,3);


    //为了不影响原始图片

    Mat mat_image_clone = mat_image_dst.clone();

    

    for(int i =0;i<height - level;i+=level){

        

        for(int j =0;j<width - level;j+=level){

            //矩阵区域

            Rect2i rect = Rect2i(j, i, level, level);

            

            //给填Rect2i区域->填充数据->原始数据

            Mat roi = mat_image_dst(rect);

        

            让整个矩形区域颜色值保持一致

            //mat_image_clone.at<Vec3b>(i, j)->像素点(颜色值组成->多个)->ARGB->数组

            //mat_image_clone.at<Vec3b>(i, j)[0]->R值

            //mat_image_clone.at<Vec3b>(i, j)[1]->G值

            //mat_image_clone.at<Vec3b>(i, j)[2]->B值

            Scalar scalar = Scalar(

                                   mat_image_clone.at<Vec3b>(i,j)[0],

                                   mat_image_clone.at<Vec3b>(i,j)[1],

                                   mat_image_clone.at<Vec3b>(i,j)[2]);

           

           

//将处理好矩形区域->数据->拷贝到图片上面去->修改后的数据

                //CV_8UC3解释一下->后面也会讲到

                //CV_:表示框架命名空间

                //8表示:32位色->ARGB->8位 = 1字节 -> 4个字节

                //U分析

                //两种类型:有符号类型(Sign->有正负->简写"S")、无符号类型(Unsign->正数->"U")

                //无符号类型:0-255(通常情况)

                //有符号类型:-128-127

                //C分析:char类型

                //3表示:3个通道->RGB


            Mat rocopy = Mat(rect.size(), CV_8UC3, scalar);

            rocopy.copyTo(roi);

        }

    }


        //把处理好的图片返回

    return MatToUIImage(mat_image_dst);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值