OpenCV——給圖片換背景

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”表示將讀入的圖像強制轉化爲一幅單通道灰度圖像;

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章