OpenCV&C++实现图片马赛克效果

图片马赛克效果

还没开学,在家闲来无事,就自己写了点代码实现了图片马赛克的效果。看了网上很多大佬的文章,决定还是自己动手来试试。配置环境为: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;

下面只要对每个矩形区域进行遍历就可以了。
放一张实现后的效果图:
OpenCV&C++实现图片马赛克效果_第1张图片

代码实现

#include
#include

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);
}

你可能感兴趣的:(OpenCV,opencv,计算机视觉)