OpenCV之-实现图片马赛克

第一什么是OpenCV?

  • 跨平台视觉库
  • 支持c/c++. java. python. oc . swift. ruby等语言
  • 支持Windows平台,Mac平台,Ios平台,Android平台,Linux平台

第二发展历程:

从1999年至2018年持续更新。

第三支持模块:

1、人机互动 2、物体识别 3、图像分割4、人脸识别5、动作识别 6、运动跟踪7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶(百度)

前往官网下载最新版本3.4.1

马赛克的实现原理:

   把图片划分成若干个矩阵(自己定义矩阵的大小),把每个矩阵的第一个像素值取出渲染到其他像素点,比如1000x1000的区域,打码成10*10
01

实现效果

   图1~图4分别显示不同矩阵大小的打码效果,
02
取固定的间隔在图像处理中叫做采样频率,采样频率不够大的时候是可以通过中值、高斯等平滑方法方法补全的。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//1.先要导入刚刚下好的opencv库到工程
//2.倒入OpenCV框架
//核心头文件
#import <opencv2/opencv.hpp>
//对iOS支持
#import <opencv2/imgcodecs/ios.h>
//导入矩阵帮助类
#import <opencv2/highgui.hpp>
#import <opencv2/core/types.hpp>

+(UIImage*)opencvImage:(UIImage*)image level:(int)level{
//实现功能
//第一步:将iOS图片->OpenCV图片(Mat矩阵)
Mat mat_image_src;
UIImageToMat(image, mat_image_src);

//第二步:确定宽高
int width = mat_image_src.cols;
int height = mat_image_src.rows;

//图片类型->进行转换
//在OpenCV里面
//坑隐藏
//支持->RGB处理
//图片ARGB
//将ARGB->RGB
Mat mat_image_dst;
cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB, 3);

//调用cvtColor保持一致(RGB),进行转换的时候,一定要记得转换类型

//第三步:马赛克处理
//分析马赛克算法原理
//level = 3-> 3 * 3矩形
//动态的处理
int x = width - level;
int y = height - level;

for (int i = 0; i < y; i += level) {
for (int j = 0; j < x; j += level) {
//创建一个矩形区域
Rect2i mosaicRect = Rect2i(j, i, level, level);

//给填Rect2i区域->填充数据->原始数据
Mat roi = mat_image_dst(mosaicRect);

//让整个矩形区域颜色值保持一致
//mat_image_clone.at<Vec3b>(i, j)->取出RGB色值
//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_dst.at<Vec3b>(i, j)[0],
mat_image_dst.at<Vec3b>(i, j)[1],
mat_image_dst.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
//把scalar渲染到mosaicRect矩阵的所有区域
Mat roiCopy = Mat(mosaicRect.size(), CV_8UC3, scalar);
roiCopy.copyTo(roi);
}
}

//第四步:将OpenCV图片->iOS图片
return MatToUIImage(mat_image_dst);
}

先写到这里,未完待续—