VisualC++MeanShift算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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