OpenCV——给图片换背景

Posted OpenCV学习交流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV——给图片换背景相关的知识,希望对你有一定的参考价值。


大家先看一张图片:

 


 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

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

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代码  

  1. #include "cv.h"  

  2. #include "cxcore.h"  

  3. #include "highgui.h"  

  4. #include <iostream>  

  5. using namespace std;  

  6.   

  7. #pragma comment (lib, "cv210.lib")  

  8. #pragma comment (lib, "cxcore210.lib")  

  9. #pragma comment (lib, "highgui210.lib")  

 

 具体的实现:

 

Cpp代码  

  1. #define PRECISION  0.001  

  2. #include "cv.h"  

  3. #include "cxcore.h"  

  4. #include "highgui.h"  

  5. #include <iostream>  

  6. using namespace std;  

  7.   

  8. #pragma comment (lib, "cv210.lib")  

  9. #pragma comment (lib, "cxcore210.lib")  

  10. #pragma comment (lib, "highgui210.lib")  

  11. // the condition to judge whehter to fix piexl  

  12. bool isNeedFix(double b, double g, double r);  

  13. // fix piexl to blue  

  14. void changePixelToBlue(double &b, double &g, double &r);  

  15. int main()  

  16. {  

  17.     // IplImage指针,用来指向原始图像  

  18.     IplImage *src = 0;  

  19.     // 载入图像  

  20.     if(src = cvLoadImage("1.jpg", -1)) // 成功,则修改图像背景;(-1表示读入的图像通道数与所读入的文件相同)  

  21.     {  

  22.         // 拷贝  

  23.         IplImage* target = cvCreateImage(cvGetSize(src),  

  24.                       src->depth,  

  25.                       src->nChannels);// IplImage指针,用来指向处理过程中的图像  

  26.         cvCopy(src, target, NULL); // 拷贝  

  27.         // 像素点处理  

  28.         CvScalar s;  

  29.   

  30.         for(int i = 0; i < target->height; i++)  

  31.         {  

  32.             for(int j = 0; j < target->width; j++)  

  33.             {  

  34.                 s = cvGet2D(target, i, j); // to get the (i,j) pixel value  

  35.                 if(isNeedFix(s.val[0], s.val[1], s.val[2])) // to judge the pixel whether needs to fix   

  36.                 {  

  37.                     changePixelToBlue(s.val[0], s.val[1], s.val[2]); // fix pixel  

  38.                     cvSet2D(target,i,j,s); // to reset the (i,j) pixel value  

  39.                 }  

  40.             }  

  41.         }  

  42.         // 保存图像  

  43.         cvSaveImage("2.jpg", target);  

  44.   

  45.         cout << "处理结束!" << endl;  

  46.     }  

  47.     else  

  48.     {  

  49.         cout << "图片加载失败!" << endl;  

  50.     }  

  51.     system("pause");  

  52.     return 0;  

  53. }  

  54. // the condition to judge whehter to fix piexl  

  55. bool isNeedFix(double b, double g, double r)  

  56. {  

  57.     if(fabs(b-1)< PRECISION  

  58.         && fabs(g-1)< PRECISION  

  59.         && fabs(r-1)< PRECISION)  

  60.         return true;  

  61.     return false;  

  62. }  

  63. // fix piexl to blue  

  64. void changePixelToBlue(double &b, double &g, double &r)  

  65. {  

  66.     b = 51;  

  67.     g = 0;  

  68.     r = 51;  

  69. }  

 

需要注意的地方:

src = cvLoadImage("1.jpg", -1);

"-1"表示读入的图像通道数与所读入的文件相同;

“0”表示将读入的图像强制转化为一幅单通道灰度图像;


关注【OpenCV学习交流】

 



以上是关于OpenCV——给图片换背景的主要内容,如果未能解决你的问题,请参考以下文章

教你用OpenCV 和 Python给证件照换底色(蓝底 <-;红底-;白底)

opencv中如何让白色的区域变成透明背景,然后和别的图片融合???

opencv学习—图像融合之背景替换

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

Opencv博文收藏列表

趣味应用 | 用OpenCV自动给图片添加彩虹特效---平淡的生活需要技术的点缀