当前位置:   article > 正文

OpenCV&C++实现图片马赛克效果_c++对qimage制定区域进行马赛克

c++对qimage制定区域进行马赛克

图片马赛克效果

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

我们可以通过一个变量来控制矩形区域的大小,以便实现不同的马赛克效果:

//10*10的像素点进行填充
int arr = 10;
  • 1
  • 2

下面只要对每个矩形区域进行遍历就可以了。
放一张实现后的效果图:
在这里插入图片描述

代码实现

#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);
}
  • 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
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/94283
推荐阅读
相关标签
  

闽ICP备14008679号