基于opencv2实现证件照换背景(从蓝色到红色)

刚好手头上有一张证件照,尝试把蓝色底换成红色或白色底,网上搜的资料不多,且大多数都是基于opencv1写的,于是尝试写了下opencv2的。主要步骤为:

1.把RGB图像转换到HSV空间

2.取背景的一小块20*20,计算蓝色背景的平均色调和饱和度

3.设置阈值,取出蓝色背景替换为红色背景

4.把HSV图像转换会RGB空间

5.滤波器去除边缘效应

具体代码为:

// change_color.cpp : 定义控制台应用程序的入口点。
//证件照从蓝色底换成红色底

#include "stdafx.h"
#include 
#include 
#include 
#include 

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char *origin="Original";
	char *window="Image";
	char *str="D:\\jiangshan\\change_color\\IMG_1047.jpg";
	namedWindow(origin,1);
	namedWindow(window,1);
	Mat image=imread(str);
	if(!image.data)
	{
		cout<<"图像载入出现问题"< v;
	split(hsvImg,v);
	Mat roiH=v[0](Rect(20,20,20,20));
	Mat roiS=v[1](Rect(20,20,20,20));
	int SumH=0;
	int SumS=0;
	int avgH, avgS;//蓝底的平均色调和平均饱和度
	//取一块蓝色背景,计算出它的平均色调和平均饱和度
	for(int i=0; i<20; i++)
	{
		for(int j=0; j<20; j++)
		{
			/*SumH=SumH+roiH(i,j);*/
			SumH=int(roiH.at(j,i))+SumH;
			SumS=int(roiS.at(j,i))+SumS;
		}
	}
	avgH=SumH/400;
	avgS=SumS/400;
	//遍历整个图像
	int nl=hsvImg.rows;
	int nc=hsvImg.cols;
	int step=10;
	for(int j=0; j(j,i))<=(avgH+5) && v[0].at(j,i)>=(avgH-5)
				&&(v[1].at(j,i))<=(avgS+40) && v[1].at(j,i)>=(avgS-40))
			{
				//cout<(j,i))<(j,i)=0;
				/*cout<(j,i))<(j);
	//	for(int i=0; i

效果图:

基于opencv2实现证件照换背景(从蓝色到红色)_第1张图片

你可能感兴趣的:(opencv)