计算联通域重心
算法简介
这是一幅阿米巴的图片,在假设质量平均的情况下也就是不考虑联通域加权的情况下我们可以使用“平衡法”来计算出它的重心。
这是使用“平衡法”得到的计算结果,左边为原始图像,中间是经过二值化后再腐蚀10次的图像,最右边一幅使用蓝色圆圈标出了重心的坐标。
为了对比方方便我们直接使用一个黑心圆继续测试程序,正如期望的那样,目测重心在圆心“附近”。
代码部分
以下是代码部分,如果你已经配置好了OPENCV,应该可以跑起来。
我只是用OPENCV来载入位图图像,图像的重心估算任务由函数 calCOG(...) 来完成。
// test.cpp 文件
// 计算联通域重心
//
#include "stdafx.h"
#include <opencv.hpp>
#include <iostream>
#include "calCOG.hpp"
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *src = cvLoadImage("data//circle.bmp");
IplImage *result = cvCloneImage(src);
cvNamedWindow("阿米巴原虫");
cvShowImage("阿米巴原虫", src);
// 对图像进行二值化
cvThreshold(src, src, 200, 255, CV_THRESH_BINARY);
// 腐蚀图像
IplImage *eroderesult = cvCloneImage(src);
cvErode(src, eroderesult, 0, 10);
cvNamedWindow("腐蚀后的阿米巴");
cvShowImage("腐蚀后的阿米