作者:zjlinkpro
大家先看一张图片:
现在想要将黑色背景改为紫色,达到如下效果:
为了能实现背景更换,我们要考虑这几个问题:
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提供的函数
Cpp代码
- #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")
具体的实现:
Cpp代码
- #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学习交流】
长按或者扫描下面二维码即可关注