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

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

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

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

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

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

5.滤波器去除边缘效应

具体代码为:

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

#include "stdafx.h"
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>

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<<"图像载入出现问题"<<endl;
		return 0;
	}
	Mat roi=image(Rect(20,20,20,20));
	Mat hsvImg;
	cvtColor(image, hsvImg, CV_BGR2HSV); //将图像转换到HSV颜色空间
	//分离HSV空间,v[0]为H色调,v[1]为S饱和度,v[2]为v灰度
	vector<Mat> 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<uchar>(j,i))+SumH;
			SumS=int(roiS.at<uchar>(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<nl; j++)
	{
		for(int i=0; i<nc; i++)
		{
			//以H.S两个通道做阈值分割,把蓝色替换成红色
			if((v[0].at<uchar>(j,i))<=(avgH+5) && v[0].at<uchar>(j,i)>=(avgH-5)
				&&(v[1].at<uchar>(j,i))<=(avgS+40) && v[1].at<uchar>(j,i)>=(avgS-40))
			{
				//cout<<int(v[0].at<uchar>(j,i))<<endl;
				v[0].at<uchar>(j,i)=0;
				/*cout<<int(v[0].at<uchar>(j,i))<<endl;*/
			}
		}
	}
	Mat finImg;
	merge(v,finImg);
	Mat rgbImg;
	cvtColor(finImg,rgbImg, CV_HSV2BGR); //将图像转换回RGB空间
	imshow(origin,image);
	imshow(window,rgbImg);
	//加个滤波把边缘部分的值滤掉(此处应该用低通滤波器,但感觉不太好,还是不用了。)
	//Mat result;
	//GaussianBlur(rgbImg,result,Size(3,3),0.5);
	/*imshow(window,result);*/
	waitKey(0);
	//system("pause");
	return 0;
}

	////遍历整个图像
	//int nl=hsvImg.rows;
	//int nc=hsvImg.cols * hsvImg.channels();
	//for(int j=0; j<nl; j++)
	//{
	//	uchar *data=hsvImg.ptr<uchar>(j);
	//	for(int i=0; i<nc; i++)
	//	{
	//		cout<<int(data[i])<<" ";
	//	}
	//}

效果图:

时间: 2024-10-07 10:21:56

基于opencv2实现证件照换背景(从蓝色到红色)的相关文章

opencv —— floodFill 漫水填充,证件照换背景

漫水填充:floodFill 函数 简单来说,漫水填充就是自动选中与种子像素相连的区域,利用指定颜色进行区域颜色填充.Windows 画图工具中的油漆桶功能和 Photoshop 的魔法棒选择工具,都是漫水填充的改进和延伸. //第一个版本 int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = S

PS证件照换背景

综述 博主原创内容. 在PS里,对于抠图,比较有技术含量的便是抠头发丝了,下面为大家带来一个比较详细的抠头发丝的教程. 素材准备 在这里我们用这张图片作为抠图素材,下面让我们一步步来演示抠图的过程,并为之更换背景. 抠图过程 1.打开素材 第一步,当然是用PS打开这张图片素材啦. 2.复制通道 打开通道选项卡,按每个通道的前面的小眼睛,让红绿蓝通道依次显示,观察哪一个通道明暗对比更加明显,在这里,我们发现蓝色通道的明暗对比更加明显,那我们就右键复制,建立蓝色通道的一个副本,如图所示. 3.调整色

ps证件照快速换背景方法

给证件照快速换背景是我们经常需要的,下面教大家如何快速换背景 用快速选择工具即可 选择要换的区块----选择背景色----按Ctrl+Delete 填充就可以了 三步就简单的扣个差不多了 证件照片换背景 打造***照片换背景 Photoshop给照片换背景 方法:图像---调整------替换颜色

c#实现超实用的&lt;证件照换底色&gt;小工具

1前言     我们在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以前照了张蓝底的.这时候你想换个底色,于是在百度上一搜“证件照换底色”,出来了一堆photoshop 教程,程序员可以找公司美工帮个忙,但是一般人就很纠结了,所以呢我就花了半天的功夫写了一个小软件,简化大家的操作难度,哎!现在越来越发现会写点程序真好.O(∩_∩)O哈哈~ 2.实现思路 (1)首先说一下像素的组成RGB 当前展示白色的RGB值是255,255,2

ps如果换背景

一.魔棒工具 魔棒工具主要是使用户可以选择颜色一致的区域(例如,一朵红花)或者背景比较单调的图片,而不必跟踪其轮廓.魔棒工具选择的颜色范围可以由工具选项栏中的误差范围 参数值来控制. 二.钢笔工具 路径是Photoshop提供的一种用来绘制选区边界和描边的方法,它是我们绘制图像的得力助手.路径是由贝塞尔曲线构成的线条和图形,它一般分为开放路经和闭合路径两种. 如果要将路径转换为选区的话,则必须是闭合路径.使用路径来抠取人物比较适合于人物的边缘轮廓线比较清晰的照片. ps如果换背景,布布扣,bub

基于OpenCV2:实现7种差异描述算子

最近在一些机器视觉群中的一些小伙伴们多次问到opencv是否集成了LBP算法,据我了解opencv没有单独的LBP特征描述算法实现,都是和一些应用结合,如人脸识别,检测等,这些都是一些论文的研究成果,针对于特定的应用,这对于想将LBP特征描述用到自己的应用中的伙伴来说,或许不太方便.opencv也没有一个单独的特征描述这样的一个module,这或许限制了使用opencv的灵活性,而且个人体会视觉问题最终根本的问题都落在了特征描述这样的一个最基本的问题,包括近几年很火的深度学习,其解决的最根本问题

ppt怎么换背景图片|PPT换背景设置方法

PPT怎么换背景?PPT背景可谓是PPT幻灯片的灵魂,优美绚丽的PPT背景能为自己做的PPT幻灯片锦上添花.今天,格子啦小编就教大家PPT换背景的方法,让你不再羡慕别人所做PPT的美丽背景,也可以自己制作. PPT换背景第一步. 在进行制作之前我们首先需要下载幻灯片制作工具PowerPoint. PPT换背景第二步. 然后我们点击设计选项(如下图红线标注处所示),我们会发现这里有很多系统自带的设计模板,从中随便选择一个然后点击,会看见原来的幻灯片背景已经改变了. 当我们在点击新建幻灯片的时候是不

JS-定时器换背景

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>无标题文档</title></head> <body> <input type="button" value="换背景吧" /

光影魔术手抠图、换背景图文教程

很多网友想制作抠图,加背景合成图片,小编在这里向朋友们介绍一项非常简单实用的抠图合成技巧.那就是用光影魔术手来制作.以下是我学习制作的心得体会,与朋友们分享. 现在我们用光影魔术手来制作抠图及添加背景图片.需要注意的是抠取出来的前景图片大小.方向一定要适合背景图片,图片本身前景和背景差异比较大.且边缘较清晰的图抠取出来也就容易很多. 制作前大家先准备好一张需要抠取的前景图片和一张背景图片.这是需要抠取的前景图片: 下面是一张要合成的背景图片,为了配合前景图片,背景图片是经过缩小以后的效果图, 大