资源简介

使用C++以及OpenCV实现的最小二乘法的平面拟合,以及应用平面拟合达到的图像背景去除。

资源截图

代码片段和文件信息

/*==================================================================
=  代码内容:最大熵阈值分割                                      
=  修改日期:2009-3-6                                                                                                         
=  作者:crond123 
=  博客:http://blog.csdn.net/crond123/
=   E_Mail:crond123@163.com                                                      
====================================================================*/


#include “stdafx.h“

#include “cv.h“
#include “cxcore.h“
#include “highgui.h“
#include “cxerror.h“

#pragma comment(lib“highgui.lib“)
#pragma comment(lib“cv.lib“) 
#pragma comment(lib“cvaux.lib“) 
#pragma comment(lib“cxcore.lib“) 

/*
* 假定 src mask 为8位单通道 dst 为 [3*1]矩阵
*     平面方程为 z = ax+by+c;
* 将实验数据带入方程 z 中得到 
*         |a|
* A|b| = b
*    |c|
* A =  (xiyi1)  i=1-n n为待拟合点数
*      b  =  (I(xiyi))  i=1-n n为待拟合点数
*      
*      由最小二乘公式的 
*     
*
*         |a|
*    |b| = A+b = (A AH)-1 AH b
*    |c|
*/
int  LeastSquaresFittingPlane( const CvArr* src const CvArr* mask CvArr* dst)
{

CvMat input_hdr mask_hdr output_hdr;
CvMat* input_img *input_mask *output_img;

input_img = cvGetMat( src &input_hdr );
    input_mask = cvGetMat( mask &mask_hdr );
    output_img = cvGetMat( dst &output_hdr );
if( !CV_ARE_SIZES_EQ(input_imginput_mask) )
return -1;

int mask_count = 0;
int width = input_mask->width;
int height = input_mask->height;
for(int y=0;y for(int x=0;x {
if(CV_MAT_ELEM(*input_maskucharyx)>0)
mask_count ++;
}

CvMat* A = cvCreateMat(mask_count3CV_32FC1);
CvMat* AH = cvCreateMat(3mask_countCV_32FC1);
CvMat* A_mul_AH = cvCreateMat(33CV_32FC1);
CvMat*  AH_mul_b = cvCreateMat(31CV_32FC1);
CvMat* b = cvCreateMat(mask_count1CV_32FC1);
// CvMat* result =  cvCreateMat(31CV_32SC1);

int mask_index = 0;
for(int y=0;y for(int x=0;x {
uchar cur_val = CV_MAT_ELEM(*input_maskucharyx);
if(cur_val==0)
continue ;
CV_MAT_ELEM(*Afloatmask_index0) = (float)x;
CV_MAT_ELEM(*Afloatmask_index1) =  (float)y;
CV_MAT_ELEM(*Afloatmask_index2) = (float)1;

CV_MAT_ELEM(*bfloatmask_index0) = (float)CV_MAT_ELEM(*input_imgucharyx);
mask_index ++;
}
cvTranspose(AAH); // AH = A的转制 
cvMulTransposed(AA_mul_AH1);//A_mul_AH = A AH
cvInvert(A_mul_AHA_mul_AH);// A_mul_AH = (A_mul_AH)-1 
cvmMul(AHbAH_mul_b);//AH_mul_b = AH b
cvmMul(A_mul_AHAH_mul_bdst);//dst = (abc)H = A_mul_AH AH_mul_b

cvReleaseMat(&A);
cvReleaseMat(&AH);
cvReleaseMat(&A_mul_AH);
cvReleaseMat(&AH_mul_b);
cvReleaseMat(&b);
return 0;
}

void backgroundCorrectLeastSquaresFittingPlane(IplImage * srcIplImage * dstIplImage * bgplane)
{

IplImage * mask = cvCreateImage(cvGetSize(src)IPL_DEPTH_8U1);

cvSet(maskcvScalar(255));
CvMat * result = cvCreateMat(31CV_32FC1

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4336  2009-03-06 10:11  LeastSquaresFittingPlane\LeastSquaresFittingPlane.cpp

     文件       4556  2009-03-06 08:17  LeastSquaresFittingPlane\LeastSquaresFittingPlane.vcproj

     文件       1428  2009-03-06 09:54  LeastSquaresFittingPlane\LeastSquaresFittingPlane.vcproj.WENYAOGUANG.Administrator.user

     文件       1408  2009-03-05 19:27  LeastSquaresFittingPlane\ReadMe.txt

     文件     210090  2009-03-06 09:54  LeastSquaresFittingPlane\result.jpg

     文件        311  2009-03-05 19:27  LeastSquaresFittingPlane\stdafx.cpp

     文件        376  2009-03-05 19:27  LeastSquaresFittingPlane\stdafx.h

     文件    1125016  2009-03-02 21:07  LeastSquaresFittingPlane\test.jpg

     目录          0  2009-03-06 10:16  LeastSquaresFittingPlane

----------- ---------  ---------- -----  ----

              1347521                    9


评论

共有 条评论