生活随笔
收集整理的這篇文章主要介紹了
图像代数运算:平均值去噪,减去背景
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代數(shù)運算,就是對兩幅圖像的點之間進行加、減、乘、除的運算。四種運算相應(yīng)的公式為:
代數(shù)運算中比較常用的是圖像相加和相減。圖像相加常用來求平均值去除addtive噪聲或者實現(xiàn)二次曝光(double-exposure)。圖像相減用于減去背景或周期噪聲,污染等。
圖像相加
OpenCV中提供了相加的函數(shù)
[cpp]?view plaincopy
void?cvAcc(??? ???????????const?CvArr*?image,?? ???????????CvArr*?sum,???? ???????????const?CvArr*?mask=NULL?? ?);?? 我們還需要用到一個線性變換轉(zhuǎn)換函數(shù)來對相加的結(jié)果求平均
[cpp]?view plaincopy
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的一段幸運團的視頻做實驗,截取視頻的某幾個連續(xù)幀求平均值:
[cpp]?view plaincopy
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;?? }?? 以下從左到右分別是連續(xù)兩幀、四幀、八幀、十六幀求均值的結(jié)果:
? ?
? ?
實踐:圖像二次曝光
曝光和去噪是一樣的,也是對幾幅圖像求平均
[cpp]?view plaincopy
?? 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函數(shù)計算兩數(shù)組的差的絕對值
[cpp]?view plaincopy
void?cvAbsDiff(??? ????????const?CvArr*?src1,?? ????????const?CvArr*?src2,?? ????????CvArr*?dst?? );??
實踐:減去背景
減去背景是通過兩幅圖像代數(shù)相減,可以判斷出前景區(qū)域和運動區(qū)域,這是最簡單(很多時候也是效果很好的)運動檢測方法。
[cpp]?view plaincopy
?? 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;?? }?? 效果圖:
轉(zhuǎn)載請注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7610665
實驗代碼及視頻下載:http://download.csdn.net/detail/xiaowei_cqu/4335573
總結(jié)
以上是生活随笔為你收集整理的图像代数运算:平均值去噪,减去背景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。