//采用金字塔方法进行图像分割
#include "highgui.h"
#include"cv.h"
#include <opencv2/legacy/legacy.hpp>
void doPyrSegmentation(IplImage * src, IplImage * dst
) {
assert(src->width % 2 == 0 && src->height % 2 == 0);
CvMemStorage * stoage = cvCreateMemStorage(0);
CvSeq* comp = NULL;
int level = 2; //进行n层采样
double threshold1 = 150;
double threshold2 = 30;
cvPyrSegmentation(src, dst, stoage, &comp, level, threshold1, threshold2);
};
int main(int argc, char ** argv)
{
IplImage * src = cvLoadImage("Lena.tiff",1);
IplImage * dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
doPyrSegmentation(src, dst);
cvNamedWindow("src");
cvNamedWindow("dst");
cvShowImage("src", src);
cvShowImage("dst", dst);
cvWaitKey(0);
cvDestroyAllWindows();
return 0;
}
////Storage: 存储连通部件的序列结果
//// comp
//// 分割部件的输出序列指针 components.
//// level
//// 建立金字塔的最大层数
//// threshold1
//// 建立连接的错误阈值
//// threshold2
//// 分割簇的错误阈值
//// 函数 cvPyrSegmentation 实现了金字塔方法的图像分割。金字塔建立到 level 指定的最大层数。如果 p(c(a), c(b))<threshold1, 则在层 i 的象素点 a 和它的相邻层的父亲象素 b 之间的连接被建立起来,
////
//// 定义好连接部件后,它们被加入到某些簇中。如果p(c(A), c(B))<threshold2,则任何两个分割 A 和 B 属于同一簇。
////
//// 如果输入图像只有一个通道,那么
////
//// p(c1, c2) = | c1 - c2 | .
//// 如果输入图像有单个通道(红、绿、兰),那幺
////
//// p(c1, c2) = 0, 3·(c1r - c2r) + 0, 59·(c1g - c2g) + 0, 11·(c1b - c2b) .
//// 每一个簇可以有多个连接部件。
OpenCV学习之采用金字塔方法进行图像分割
最新推荐文章于 2022-07-06 16:07:29 发布
本文介绍了一种基于金字塔方法的图像分割技术实现。通过设置不同的层级和阈值参数,该方法能够有效地将图像划分为不同的区域。文章提供了完整的C++代码示例,并详细解释了cvPyrSegmentation函数的工作原理。
2609

被折叠的 条评论
为什么被折叠?



