【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

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据