OpenCV是一个基于C/C++语言的开源图像处理函数库;通过这个函数库,我们可以对图像进行一些处理;这些处理包括很多内容,而本篇文章只是讲述如何更换图像背景颜色;
----------------------------------------------------------------------------------------------------------------------------------
大家先看一张图片:
现在想要将黑色背景改为紫色,达到如下效果:
为了能实现背景更换,我们要考虑这几个问题:
1.在狭义的观点上,计算机只认识0和1,也就是说计算机只能处理字符和数字,现在怎么处理图片?
一个想法,就是map;我们要建立数字与图片的map;
也就是用矩阵来存储图片的像素点的值;
2.怎么知道这个像素点属于背景?
因为一种颜色的RGB是固定的,所以只要确定背影的颜色的RGB,根据这个标准来判断是否是背景,这里黑色的RGB为(1,1,1);(当然这里不考虑非背景中存在背景颜色)
由于背景的各个像素点的RGB可能存在稍微不同,所以判断的时候最好设置精度;
3.已经知道是背景颜色的像素点,怎么更换像素的RGB
1)怎么表示某一像素的RGB
CvScalar s;
2)怎么获取图片中的某一像素的RGB
s = cvGet2D(target, i, j); (target指的是图像指针, 而i, j指的是矩阵坐标)
3)更换
cvSet2D(target,i,j,s); (target指的是图像指针, 而i, j指的是矩阵坐标,s为RGB修改后)
注:这里要改为紫色 (即s = RGB(51,0,51))
4.使用openCV ,要加什么?
在代码里,要加下面的一段代码,即可使用openCV提供的函数
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
using namespace std;
#pragma comment (lib, "cv210.lib")
#pragma comment (lib, "cxcore210.lib")
#pragma comment (lib, "highgui210.lib")
具体的实现:
#define PRECISION 0.001
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
using namespace std;
#pragma comment (lib, "cv210.lib")
#pragma comment (lib, "cxcore210.lib")
#pragma comment (lib, "highgui210.lib")
// the condition to judge whehter to fix piexl
bool isNeedFix(double b, double g, double r);
// fix piexl to blue
void changePixelToBlue(double &b, double &g, double &r);
int main()
{
// IplImage指针,用来指向原始图像
IplImage *src = 0;
// 载入图像
if(src = cvLoadImage("1.jpg", -1)) // 成功,则修改图像背景;(-1表示读入的图像通道数与所读入的文件相同)
{
// 拷贝
IplImage* target = cvCreateImage(cvGetSize(src),
src->depth,
src->nChannels);// IplImage指针,用来指向处理过程中的图像
cvCopy(src, target, NULL); // 拷贝
// 像素点处理
CvScalar s;
for(int i = 0; i < target->height; i++)
{
for(int j = 0; j < target->width; j++)
{
s = cvGet2D(target, i, j); // to get the (i,j) pixel value
if(isNeedFix(s.val[0], s.val[1], s.val[2])) // to judge the pixel whether needs to fix
{
changePixelToBlue(s.val[0], s.val[1], s.val[2]); // fix pixel
cvSet2D(target,i,j,s); // to reset the (i,j) pixel value
}
}
}
// 保存图像
cvSaveImage("2.jpg", target);
cout << "处理结束!" << endl;
}
else
{
cout << "图片加载失败!" << endl;
}
system("pause");
return 0;
}
// the condition to judge whehter to fix piexl
bool isNeedFix(double b, double g, double r)
{
if(fabs(b-1)< PRECISION
&& fabs(g-1)< PRECISION
&& fabs(r-1)< PRECISION)
return true;
return false;
}
// fix piexl to blue
void changePixelToBlue(double &b, double &g, double &r)
{
b = 51;
g = 0;
r = 51;
}
需要注意的地方:
src = cvLoadImage("1.jpg", -1);
"-1"表示读入的图像通道数与所读入的文件相同;
“0”表示将读入的图像强制转化为一幅单通道灰度图像;
分享到:
相关推荐
OpenCv —— 人脸识别(附完整源码)。具体查看csdn文章: ...
OpenCv —— 检测高速车流。具体查看csdn博文:https://blog.csdn.net/automoblie0/article/details/125440284?spm=1001.2014.3001.5502
openCV——寻找并绘制图像的轮廓 在二值图像中寻找轮廓
C# OpenCv 给证件照换底色
opencv_source_code chm格式 很好用
本文实例为大家分享了Opencv实现抠图替换背景图的具体代码,供大家参考,具体内容如下 下面简单图片演示一下: 提取mask: ===> 替换背景: + = python的opencv代码如下: # coding=utf-8 import cv2 import ...
具体查看博文:...
用于学习OpenCV的一本很好的教材,清晰的英文原版,看了就舒服,分享ing.
1.下载了最新的opencv_python-3.2.0.7-cp35-cp35m-win_amd64.whl,使用pip安装成功 2. import cv2 失败,ImportError: DLL load failed: 找不到指定的模块 3. 按照网上博客提示,下载 Visual C++ Redistributable ...
opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接opencv图片拼接...
x64下编译好的,结合了opencv3.4.1核心库和contrib3.4.1额外库
boostdesc_bgm.i; boostdesc_bgm_bi.i; boostdesc_bgm_hd.i; boostdesc_binboost_064.i; boostdesc_binboost_128.i; boostdesc_binboost_256.i; boostdesc_Ibgm.i; vgg_generated_48.i; vgg_generated_64.i;...
opencvsharp4照片纯色背景更换,可通过RGB通道过滤背景
《OpenCV教程——基础篇》刘瑞祯 实例源代码。有注释,project,范例代码齐全。
基于OpenCV下纯色背景图片批量更换复杂背景
通过重载QLabel函数,实现图片的缩放和移动(通过右键菜单启用功能)在图片上打矩形掩码,并处理原图数据流(打掩码时不能移动或缩放图片),还带一个裁剪框;
opencv库移植到DSP上面
OpenCV教程——基础篇3,于仕琪著,这两天正在学习
主要介绍了用opencv给图片换背景色的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧