代数运算,就是对两幅图像的点之间进行加、减、乘、除的运算。四种运算相应的公式为:

代数运算中比较常用的是图像相加和相减。图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-exposure)。图像相减用于减去背景或周期噪声,污染等。

图像相加

OpenCV中提供了相加的函数
[cpp] view plaincopy
  1. void cvAcc(
  2. const CvArr* image,//输入图像
  3. CvArr* sum,  //累积图像
  4. const CvArr* mask=NULL//可选的运算
  5. );

我们还需要用到一个线性变换转换函数来对相加的结果求平均

[cpp] view plaincopy
  1. void cvConvertScale(
  2. const CvArr* src, //输入数组
  3. CvArr* dst,//输出数组
  4. double scale=1,//比例
  5. double shift=0 //缩放比例,可选
  6. );
  7. #define cvCvtScale cvConvertScale
  8. #define cvScale  cvConvertScale
  9. #define cvConvert( src, dst )  cvConvertScale( (src), (dst), 1, 0 )

实践:平均值去噪

我们用NASA的一段幸运团的视频做实验,截取视频的某几个连续帧求平均值:
[cpp] view plaincopy
  1. int main()
  2. {
  3. CvCapture* capture=cvCaptureFromFile("media.avi");
  4. IplImage* frame=  NULL;
  5. IplImage * imgsum =NULL;
  6. int start=301;
  7. int end=304;
  8. cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, start);
  9. int count = start;
  10. while( cvGrabFrame(capture) && count <= end )
  11. {
  12. frame = cvRetrieveFrame(capture);// 获取当前帧
  13. if(imgsum==NULL){
  14. imgsum=cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,3);
  15. cvZero(imgsum);
  16. }
  17. cvAcc(frame,imgsum);
  18. char testname[100];
  19. sprintf(testname,"%s%d%s","image",count,".jpg");
  20. cvShowImage(testname,frame);
  21. cvSaveImage(testname,frame);
  22. count++;
  23. }
  24. IplImage * imgavg = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
  25. cvConvertScale(imgsum,imgavg,1.0/4.0);
  26. cvShowImage("imageavg",imgavg);
  27. cvSaveImage("imageavg_4.jpg",imgavg);
  28. cvWaitKey(0);
  29. cvReleaseCapture(&capture);
  30. return 0;
  31. }

以下从左到右分别是连续两帧、四帧、八帧、十六帧求均值的结果:

   
   

实践:图像二次曝光

曝光和去噪是一样的,也是对几幅图像求平均
[cpp] view plaincopy
  1. //通过求平均二次曝光
  2. int main()
  3. {
  4. IplImage* image1=  cvLoadImage("psu3.jpg");
  5. IplImage* image2=  cvLoadImage("psu4.jpg");
  6. IplImage * imgsum =cvCreateImage(cvGetSize(image1),IPL_DEPTH_32F,3);
  7. cvZero(imgsum);
  8. cvAcc(image1,imgsum);
  9. cvAcc(image2,imgsum);
  10. IplImage * imgavg = cvCreateImage(cvGetSize(image1),IPL_DEPTH_8U,3);
  11. cvConvertScale(imgsum,imgavg,1.0/2.0);
  12. cvShowImage("imageavg",imgavg);
  13. cvSaveImage("avg.jpg",imgavg);
  14. cvWaitKey(0);
  15. cvReleaseImage(&image1);
  16. cvReleaseImage(&image2);
  17. cvReleaseImage(&imgsum);
  18. cvReleaseImage(&imgavg);
  19. return 0;
  20. }

下图是对同学街舞截图的“二次曝光”效果:

图像相减

OpenCV中用cvAbsDiff函数计算两数组的差的绝对值
[cpp] view plaincopy
  1. void cvAbsDiff(
  2. const CvArr* src1,//第一个输入数组
  3. const CvArr* src2,//第二个输入数组
  4. CvArr* dst//输出数组
  5. );

实践:减去背景

减去背景是通过两幅图像代数相减,可以判断出前景区域和运动区域,这是最简单(很多时候也是效果很好的)运动检测方法。
[cpp] view plaincopy
  1. //减去背景
  2. int main()
  3. {
  4. IplImage* pFrame = NULL;
  5. IplImage* pFrImg = NULL;
  6. IplImage* pBkImg = NULL;
  7. CvMat* pFrameMat = NULL;
  8. CvMat* pFrMat = NULL;
  9. CvMat* pBkMat = NULL;
  10. CvCapture* pCapture = NULL;
  11. int nFrmNum = 0;
  12. //创建窗口
  13. cvNamedWindow("video", 1);
  14. cvNamedWindow("background",1);
  15. cvNamedWindow("foreground",1);
  16. pCapture = cvCaptureFromFile("media.avi");
  17. while(pFrame = cvQueryFrame( pCapture ))
  18. {
  19. nFrmNum++;
  20. //如果是第一帧,需要申请内存,并初始化
  21. if(nFrmNum == 1)
  22. {
  23. pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);
  24. pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);
  25. pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  26. pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  27. pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  28. //转化成单通道图像再处理
  29. cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
  30. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  31. cvConvert(pFrImg, pFrameMat);
  32. cvConvert(pFrImg, pFrMat);
  33. cvConvert(pFrImg, pBkMat);
  34. }
  35. else
  36. {
  37. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  38. cvConvert(pFrImg, pFrameMat);
  39. //当前帧跟背景图相减
  40. cvAbsDiff(pFrameMat, pBkMat, pFrMat);
  41. //二值化前景图
  42. cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);
  43. //更新背景
  44. cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
  45. //将背景转化为图像格式,用以显示
  46. cvConvert(pBkMat, pBkImg);
  47. cvShowImage("video", pFrame);
  48. cvShowImage("background", pBkImg);
  49. cvShowImage("foreground", pFrImg);
  50. if( cvWaitKey(2) >= 0 )
  51. break;
  52. }
  53. }
  54. cvDestroyWindow("video");
  55. cvDestroyWindow("background");
  56. cvDestroyWindow("foreground");
  57. cvReleaseImage(&pFrImg);
  58. cvReleaseImage(&pBkImg);
  59. cvReleaseMat(&pFrameMat);
  60. cvReleaseMat(&pFrMat);
  61. cvReleaseMat(&pBkMat);
  62. cvReleaseCapture(&pCapture);
  63. return 0;
  64. }

效果图:

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7610665
实验代码及视频下载:http://download.csdn.net/detail/xiaowei_cqu/4335573

转载于:https://www.cnblogs.com/alan666/p/8312343.html

【OpenCV】图像代数运算:平均值去噪,减去背景相关推荐

  1. 图像代数运算:平均值去噪,减去背景

    代数运算,就是对两幅图像的点之间进行加.减.乘.除的运算.四种运算相应的公式为: 代数运算中比较常用的是图像相加和相减.图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-ex ...

  2. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  3. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  4. 学习使用非局部平均值去噪算法去除图像中的噪音-图像去噪

    图像去噪 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored() ...

  5. OpenCV图像旋转,指定填充背景颜色边界颜色

    OpenCV图像旋转,指定填充背景颜色边界颜色 OpenCV与图像旋转有关的函数: (1)warpAffine函数 void cv::warpAffine ( InputArray  src,     ...

  6. python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)

    python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录

  7. 【笔记】opencv的python使用 腐蚀模糊背景分割等处理图像

    概括 从概念上讲,一个字节能表示0到255的整数.目前,对于所有的实时图像应用而言, 虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.array类型的二维或三维 ...

  8. opencv 图像与视频分析教程③

    opencv 图像与视频分析教程 代码: https://github.com/bai1231/opencv-learn_and_pratice 二值图像分析 图像二值化 二值图像轮廓分析 霍夫检测 ...

  9. OpenCV图像锐化/增强

    OpenCV图像锐化/增强 0.综述 1.Laplacian高通滤波算子 2.Laplacian锐化代码实践 3.USM锐化增强算法 4.USM代码实践 0.综述 图像的卷积计算除了可以完成我们前面介 ...

最新文章

  1. python操作word文档(python-docx)
  2. 第三方开始菜单软件使微软 Windows 10 升级时崩溃
  3. 网站压力测试工具webbench简介、安装、使用
  4. #1098 : 最小生成树二·Kruscal算法
  5. Simpleperf介绍
  6. 网易严选宣布退出双11?
  7. Java怎么不启动_dubbo不启动了怎么回事???一模一样的另一个没问题
  8. Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
  9. python数据结构剑指offer-替换空格
  10. 架设WIN32汇编程序的开发环境
  11. 常用的107条Javascript
  12. python计算正弦值_Python科学计算(二)——正弦信号的时域波形与频谱图
  13. 计算机excel无法打开,双击Excel软件无法打开表格文件怎么办?
  14. 办公软件不能打印能打印测试页,在office办公软件word中不能打印是什么原因
  15. Laravel文档阅读笔记-Custom Authentication Login And Registration Using Laravel 8
  16. Educational Codeforces Round 91 (Rated for Div. 2) D.Berserk And Fireball(思维,暴力破解,分情况)
  17. JavaScript概述和HTML中嵌入JavaScript的三种方式
  18. matlab中cell是什么意思,matlab中cell的用法
  19. vlc插件详细使用说明
  20. 基于大数据分析的葡萄酒品质鉴别系统设计与实现

热门文章

  1. git stash 拉去_git操作命令符
  2. python规则网格插值_Python中规则网格上的插值
  3. linux mint 屏保_Linux Mint 修复了两个孩子发现的屏保锁定绕过漏洞
  4. vue weex 调用原生toast_vue-template-compiler 还能这么用
  5. 云服务器可以安装操作系统么,云服务器能装操作系统吗
  6. 按器件划分微型计算机是()计算机,计算机与信息技术概述(答案)
  7. android 停用应用的命令,免Root使用ADB命令_停用手机系统应用
  8. WifiP2pSettings工作流程
  9. Yolo(2)Yolo v2
  10. OpenCV(十二)漫水填充算法