`
zjlinkpro
  • 浏览: 50024 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

OpenCV——给图片换背景

J# 
阅读更多

OpenCV是一个基于C/C++语言的开源图像处理函数库;通过这个函数库,我们可以对图像进行一些处理;这些处理包括很多内容,而本篇文章只是讲述如何更换图像背景颜色;

----------------------------------------------------------------------------------------------------------------------------------

大家先看一张图片:

图片2

 


 

 

 

 

 

现在想要将黑色背景改为紫色,达到如下效果:      

图片2

 

 

 

 

 

 

 

 

 

 

 

为了能实现背景更换,我们要考虑这几个问题

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”表示将读入的图像强制转化为一幅单通道灰度图像;

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics