赞
踩
还没开学,在家闲来无事,就自己写了点代码实现了图片马赛克的效果。看了网上很多大佬的文章,决定还是自己动手来试试。配置环境为:OpenCV4.1.2+Visual Studio
要想图片实现马赛克的效果,其实很简单,我们可以给图片划分成很多个小的矩形区域,让每个小的矩形区域都取矩形区域左上角的颜色值。
对于彩色图片,访问特定像素值的颜色值并进行相应的更改可以这么写:
src.at<Vec3b>(k, m)[0] = src.at<Vec3b>(i, j)[0];
src.at<Vec3b>(k, m)[1] = src.at<Vec3b>(i, j)[1];
src.at<Vec3b>(k, m)[2] = src.at<Vec3b>(i, j)[2];
我们可以通过一个变量来控制矩形区域的大小,以便实现不同的马赛克效果:
//10*10的像素点进行填充
int arr = 10;
下面只要对每个矩形区域进行遍历就可以了。
放一张实现后的效果图:
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat src = imread("F:/opencv/images/lenacolor.png"); int width = src.rows; //图片的长度 int height = src.cols; //图片的宽度 //10*10的像素点进行填充 int arr = 10; //i和j代表了矩形区域的左上角的像素坐标 for (int i = 0; i < width; i+=arr) { for (int j = 0; j < height; j+=arr) { //对矩形区域内的每一个像素值进行遍历 for (int k = i; k < arr + i && k < width; k++) { for (int m = j; m < arr + j && m < height; m++) { //在这里进行颜色的修改 src.at<Vec3b>(k, m)[0] = src.at<Vec3b>(i, j)[0]; src.at<Vec3b>(k, m)[1] = src.at<Vec3b>(i, j)[1]; src.at<Vec3b>(k, m)[2] = src.at<Vec3b>(i, j)[2]; } } } } imshow("change image", src); waitKey(0); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。