原理:马赛克可以理解为降低原图像的分辨率,用一组大像素覆盖原图区域,大像素的值用覆盖区域小像素的均值替代。
代码:
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
int main()
{
cv::Mat img = cv::imread("D:\\timg.jpg");
cv::Mat ROI(img, cv::Rect(0, 0, 400, 400)); //马赛克区域
int W = 20, H = 20; //大像素期望宽高
int W1, H1; //大像素实际宽高,马赛克区域不一定能恰好放下整数个大像素,在边界需作截断
int i, j;
for (i = 0; i < ROI.rows; i += H)
{
H1 = (ROI.rows - i >= H) ? H : (ROI.rows - i); //判断边界条件
for (j = 0; j < ROI.cols; j += W)
{
W1 = (ROI.cols - j >= W) ? W : (ROI.cols - j);
cv::Mat tmp(ROI, cv::Rect(j, i, W1, H1));
tmp = cv::mean(tmp);
}
}
cv::imshow("result", img);
cv::waitKey(20000);
return 0;
}
效果:
原图
处理结果