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

2024-02-19 21:32

本文主要是介绍【OpenCV】图像代数运算:平均值去噪,减去背景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


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

图像相加


OpenCV中提供了相加的函数
void cvAcc( const CvArr* image,//输入图像CvArr* sum,  //累积图像 const CvArr* mask=NULL//可选的运算);
我们还需要用到一个线性变换转换函数来对相加的结果求平均
void cvConvertScale( const CvArr* src, //输入数组CvArr* dst,//输出数组double scale=1,//比例double shift=0 //缩放比例,可选
);
#define cvCvtScale cvConvertScale
#define cvScale  cvConvertScale
#define cvConvert( src, dst )  cvConvertScale( (src), (dst), 1, 0 )


实践:平均值去噪

我们用NASA的一段幸运团的视频做实验,截取视频的某几个连续帧求平均值:
int main()
{CvCapture* capture=cvCaptureFromFile("media.avi");IplImage* frame=  NULL;IplImage * imgsum =NULL;int start=301;int end=304;cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, start);int count = start;while( cvGrabFrame(capture) && count <= end ){frame = cvRetrieveFrame(capture);// 获取当前帧if(imgsum==NULL){imgsum=cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,3);cvZero(imgsum);}cvAcc(frame,imgsum);char testname[100];sprintf(testname,"%s%d%s","image",count,".jpg");cvShowImage(testname,frame);cvSaveImage(testname,frame);count++;}IplImage * imgavg = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);cvConvertScale(imgsum,imgavg,1.0/4.0);cvShowImage("imageavg",imgavg);cvSaveImage("imageavg_4.jpg",imgavg);cvWaitKey(0);cvReleaseCapture(&capture);return 0;
}
以下从左到右分别是连续两帧、四帧、八帧、十六帧求均值的结果:


实践:图像二次曝光

曝光和去噪是一样的,也是对几幅图像求平均
//通过求平均二次曝光
int main()
{IplImage* image1=  cvLoadImage("psu3.jpg");IplImage* image2=  cvLoadImage("psu4.jpg");IplImage * imgsum =cvCreateImage(cvGetSize(image1),IPL_DEPTH_32F,3);cvZero(imgsum);cvAcc(image1,imgsum);cvAcc(image2,imgsum);IplImage * imgavg = cvCreateImage(cvGetSize(image1),IPL_DEPTH_8U,3);cvConvertScale(imgsum,imgavg,1.0/2.0);cvShowImage("imageavg",imgavg);cvSaveImage("avg.jpg",imgavg);cvWaitKey(0);cvReleaseImage(&image1);cvReleaseImage(&image2);cvReleaseImage(&imgsum);cvReleaseImage(&imgavg);return 0;
}
下图是对同学街舞截图的“二次曝光”效果:


图像相减


OpenCV中用cvAbsDiff函数计算两数组的差的绝对值
void cvAbsDiff( const CvArr* src1,//第一个输入数组const CvArr* src2,//第二个输入数组CvArr* dst//输出数组
);


实践:减去背景

减去背景是通过两幅图像代数相减,可以判断出前景区域和运动区域,这是最简单(很多时候也是效果很好的)运动检测方法。
//减去背景
int main()
{IplImage* pFrame = NULL; IplImage* pFrImg = NULL;IplImage* pBkImg = NULL;CvMat* pFrameMat = NULL;CvMat* pFrMat = NULL;CvMat* pBkMat = NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;//创建窗口cvNamedWindow("video", 1);cvNamedWindow("background",1);cvNamedWindow("foreground",1);pCapture = cvCaptureFromFile("media.avi");while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;//如果是第一帧,需要申请内存,并初始化if(nFrmNum == 1){pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//转化成单通道图像再处理cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);cvConvert(pFrImg, pFrameMat);cvConvert(pFrImg, pFrMat);cvConvert(pFrImg, pBkMat);}else{cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);cvConvert(pFrImg, pFrameMat);//当前帧跟背景图相减cvAbsDiff(pFrameMat, pBkMat, pFrMat);//二值化前景图cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);//更新背景cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);//将背景转化为图像格式,用以显示cvConvert(pBkMat, pBkImg);cvShowImage("video", pFrame);cvShowImage("background", pBkImg);cvShowImage("foreground", pFrImg);if( cvWaitKey(2) >= 0 )break;}}cvDestroyWindow("video");cvDestroyWindow("background");cvDestroyWindow("foreground");cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);return 0;
}
效果图:

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







这篇关于【OpenCV】图像代数运算:平均值去噪,减去背景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726034

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编