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

代数运算中比较常用的是图像相加和相减。图像相加常用来求平均值去除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

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

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

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

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

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

  3. 去毛边 叶片图像_一种复杂背景叶片图像的全自动分割方法与流程

    本发明涉及图像处理领域,更具体地,涉及一种复杂背景叶片图像的全自动分割方法. 背景技术: 药用植物,是中药材的主要来源,是中医药治病救人的物质基础.然而,近年来,由于生态环境的恶化,药用植物资源显著萎 ...

  4. python之筛选图像中是否存在黑白背景

    python之筛选图像中是否存在黑白背景 紧接上篇文章的需求,需要进行功能增加 某些图片存在背景丢失问题,出现黑白背景现象,这种需要排查,同样交给了自动化处理. 这次不比上次了,我搜罗了一堆资料,全是 ...

  5. Android基于图像语义分割实现人物背景更换

    原文博客:Doi技术团队 链接地址:https://blog.doiduoyi.com/authors/1584446358138 初心:记录优秀的Doi技术团队学习经历 本文链接:Android基于 ...

  6. python数字图像处理-图像噪声与去噪算法

    图像噪声 椒盐噪声 概述: 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种 ...

  7. (100天2小时第二十九天)几种常见的图像噪声及去噪处理算法

    一.背景 在图像获取.传输.存储过程中常常会受到各种噪声的干扰,从而影响图像的质量.并且图像预处理算法的好坏又直接关系到后续图像处理的效果,如图像分割.目标识别.边缘处理等,所以为了获得高质量数字图像 ...

  8. 图像降噪(去噪)是什么原理?

    文章目录 噪声的产生及分类 图象降噪的方法简介编辑 均值滤波器 自适应维纳滤波器 中值滤波器 形态学噪声滤除器 小波去噪 噪声的产生及分类 噪声是图像干扰的重要原因.一幅图像在实际应用中可能存在各种各 ...

  9. OpenCV计算图像的平均值和标准差的函数meanStdDev函数的使用

    计算一个矩阵的平均值和标准差,每个通道都是独立的,通过以下输出参数获取返回值: [N=∑I,mask(I)≠01meanc=∑I:mask(I)≠0src(I)cNstddevc=∑I:mask(I) ...

最新文章

  1. 音高和基频(Pitch and F0)
  2. Java Scala 混合编程导致 编译失败 ,【找不到符号】问题解决
  3. 爱回收回应下架通报:认真整改 切实落实用户隐私信息保护
  4. swift python javascript_最小的Swift App
  5. matlab retinex,基于Retinex算法视频增强的MATLAB实现
  6. MySQL数据库面试题(2020最新版)
  7. EPUB PDF DOCX格式转换及主流格式电子书制作终极攻略(内含用WORD制作精美EPUB方法)...
  8. freeswitch cdr mysql_freeswitch XML CDRS
  9. java中的传参是什么意思_Java中参数传递是传值还是传址?
  10. python输入一个数组、以逗号为间隔_python-使用间隔掩码numpy数组
  11. RLS算法-公式初探
  12. IPA包重签企业证书
  13. webstorm 扩大内存
  14. 服务器响应状态码statusCode
  15. BCH编码(15,5)1bit串行,5bit并行
  16. 华为服务器2288H v3和V5关机不能启动处理
  17. python输出一个函数多项式_python实现PolynomialFeatures多项式的方法
  18. 马斯克:特斯拉汽车卡拉OK功能即将推出
  19. div的display属性和visibility属性
  20. MyBatis SQL语句详解

热门文章

  1. 如何让神经网络把熊猫识别为秃鹫
  2. Gartner 2015新兴技术发展周期简评:大数据实用化、机器学习崛起
  3. [搜索]一种分词的实现(2)
  4. jvm性能调优实战 - 49OOM异常进行监控以及online处理
  5. 白话Elasticsearch73_ES生产集群中的索引管理02
  6. 并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
  7. Redis-04Redis数据结构--哈希hash
  8. Java学习笔记(五)--流程控制
  9. windows powershell实战指南_【安全研究】powershell在主机中是否存在安全隐患?
  10. 深入理解ROS技术 【4】ROS下的模块详解(181-232)