VisualC++MeanShift算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Visual C++:MeanShift算法

2010/10/22 16:51

说明:

1.Meanshift.h 中包含一个图像类CImage ,这个可能每个人用的图像类都不一样,要根据你自己的图像类做相应的修改。

2.分割时,是把不同区域的均值做为该区域的全部像素的值。这一点可以在程序中看到。

3.窗宽的选择很重要,请根据实际情况自己选择。

4.为了节约运算时间,算法的迭代过程只进行了一次。

5.该类在VS2005 Visual C++.net下测试通过。

// Meanshift.h: interface for the CMeanshift class.

//

///////////////////////////////////////////////////////////////////// /

#if !defined(AFX_MEANSHIFT_H__E6E877AA_4E4D_42A7_BE5F_7A021E6311E9__I NCLUDED_)

#define

AFX_MEANSHIFT_H__E6E877AA_4E4D_42A7_BE5F_7A021E6311E9__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "Image.h"

class CMeanshift

{

public:

double computeweigth(CImage& ori_img, int i,int j,int x,int y,unsigned char currentvalue);

unsigned char MSsmooth(CImage& ori_img,int x,int y);

CMeanshift();

CMeanshift(int spatial_kwidth,int range_kwidth,char kind);

virtual ~CMeanshift();

BOOL meanshiftsmooth(CImage & ori_img,CImage & out_img);

BOOL initmeanshift(char kind);

BOOL meanshiftseg(CImage &image,int nthreshold);//对经过平滑之后的图像

进行分割

private:

double* m_pspatial_weigth;

double* m_prange_weigth;

char m_ckind; // the type of the kernel function;either 'guass" or "flat"

int m_ispatial_kwidth; // spatial kernal width

int m_irange_kwidth; // range kernal width

};

#endif

// !defined(AFX_MEANSHIFT_H__E6E877AA_4E4D_42A7_BE5F_7A021E6311E9__IN CLUDED_)

// Meanshift.cpp: implementation of the CMeanshift class.

//

///////////////////////////////////////////////////////////////////// /

#include "stdafx.h"

#include "Meanshift.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

///////////////////////////////////////////////////////////////////// /

// Construction/Destruction

///////////////////////////////////////////////////////////////////// /

CMeanshift::CMeanshift()

{

}

CMeanshift::CMeanshift(int spatial_kwidth,int range_kwidth,char kind) {

m_ispatial_kwidth = spatial_kwidth;

m_irange_kwidth = range_kwidth;

m_ckind = kind;

}

CMeanshift::~CMeanshift()

{

}

BOOL CMeanshift::meanshiftsmooth(CImage& ori_img,CImage& out_img) {

int i,j;

int img_width = ori_img.GetWidth();

int img_height = ori_img.GetHeigth();

if(!initmeanshift(m_ckind))

{

return FALSE;

}

if (!out_img.Create(CSize(img_width,img_height),FALSE))

{

return FALSE;

}

for(i = 0; i < img_height; i++)

{

for(j = 0; j < img_width; j++)

{

out_img.m_pR[i*img_width + j] = MSsmooth(ori_img,i,j);

}

}

return TRUE;

}

BOOL CMeanshift::initmeanshift(char kind)

{

int i_tempspatialnumber = 2*m_ispatial_kwidth*m_ispatial_kwidth; int i_temprangenumber = 5*m_irange_kwidth;

CString strTemp;

m_pspatial_weigth = new double[i_tempspatialnumber];

m_prange_weigth = new double[i_temprangenumber];

if(kind =='G') //guass kernel

相关文档
最新文档