第五章 - 图像形态学 - 基于图像金字塔的图像分割(cvPyrSegmentation)

本例程涉及到几个数据结构及方法,CvMemStorage、cvPyrSegmentation()、CvConnectedComp、cvGetSeqElem().

 

CvMemStorage

CvMemStorage
Growing memory storage

typedef struct CvMemStorage
{
struct CvMemBlock* bottom;/* first allocated block */
struct CvMemBlock* top; /* the current memory block - top of the stack */
struct CvMemStorage* parent; /* borrows new blocks from */
int block_size; /* block size */
int free_space; /* free space in the top block (in bytes) */
} CvMemStorage;
内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型 ---bottom 域指的是列首,top 域指的是当前指向的块但未必是列尾.在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在 top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间 -- free_space 指的是top块剩馀的空字节数。

新分配的内存缓冲区(或显式的通过 cvMemStorageAlloc 函数分配,或隐式的通过 cvSeqPush, cvGraphAddEdge等高级函数分配)总是起始于当前块(即top块)的剩馀那部分,如果剩馀那部分能满足要求(够分配的大小)。分配后,free_space 就减少了新分配的那部分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩馀空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被置为当前块(新的top块) -- free_space 被置为先前分配的整个块的大小。

如果已经不存在空的存储块(即:top块已是列尾),则必须再分配一个新的块(或从parent那继承,见 cvCreateChildMemStorage)并将该块加到列尾上去。于是,存储器(memory storage)就如同栈(Stack)那样, bottom指向栈底,(top, free_space)对指向栈顶。栈顶可通过 cvSaveMemStoragePos保存,通过 cvRestoreMemStoragePos 恢复指向, 通过 cvClearStorage 重置。

 

cvPyrSegmentation

PyrSegmentation
用金字塔实现图像分割

void cvPyrSegmentation( IplImage* src, IplImage* dst,
CvMemStorage* storage, CvSeq** comp,
int level, double threshold1, double threshold2 );
src
输入图像.
dst
输出图像.
storage
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) .
每一个簇可以有多个连接部件。图像 src 和 dst 应该是 8-比特、单通道 或 3-通道图像,且大小一样

 

CvConnectedComp

CvConnectedComp
连接部件、连接图像各部分

typedef struct CvConnectedComp
{
double area; /* 连通域的面积 */
float value; /* 分割域的灰度缩放值 */
CvRect rect; /* 分割域的 ROI */
} CvConnectedComp;

cvGetSeqElem

openCV里面的一个函数

作用:直接访问序列中的元素

格式:char * cvGetSeqElem(seq,index)

用法:

1. 首先返回的是char类型的指针,当然也可以利用强制类型转换,转换为序列中实际存储的数据类型

例如:for(int i = 0; i<seq ->total;++i)

{

        CvPoint *p = (CvPoint *)cvGetSeqElem(seq,i);

}

2. seq是需要检测的序列,而index顾名思义是元素在序列中的索引,即第几个元素

 

/*整体思路是先分割图像,形成各部分轮廓,然后连接图像各部分*/

 

[cpp] view plaincopy
  1. #include <cv.h>  
  2. #include <stdio.h>  
  3. #include <highgui.h>  
  4.   
  5. void f( IplImage* src, IplImage* dst );  
  6.   
  7. int main(int argc, char** argv )  
  8. {  
  9.     cvNamedWindow( argv[1], 1 );  //create a named window  
  10.     IplImage* src = cvLoadImage( argv[1] ); //load the image  
  11.     if( !src )   
  12.     {  
  13.         printf( "Couldn't seem to open %s", argv[1] );  //if not exist the image  
  14.         return -1;  
  15.     }  
  16.     IplImage* dst = cvCreateImage( cvGetSize( src ), src->depth, src->nChannels );  //create the image head and allocate the data  
  17.     f( src, dst ); //call the function f  
  18.   
  19.     cvShowImage( argv[1], dst );  //show the image in the named window  
  20.     while( 1 ) //wait until the user hits the "ESC" key  
  21.     {  
  22.         if( cvWaitKey( 100 ) == 27 )  
  23.             break;  
  24.     }  
  25.   
  26.     cvDestroyWindow( argv[1] ); //clean up the window and release the memory  
  27.     cvReleaseImage( &src ); //the parameter is a point  
  28.     cvReleaseImage( &dst );  
  29.   
  30.     return 0;  
  31. }  
  32.   
  33. void f( IplImage* src, IplImage* dst )  
  34. {  
  35.     CvMemStorage* storage = cvCreateMemStorage( 0 );  //apply the memory storage for the growing image data structure  
  36.     CvSeq* comp = NULL;  //growable sequence of the elements  
  37.       
  38.     cvPyrSegmentation( src, dst, storage, &comp, 4, 200, 50 );  //image segmentation and store the outline sequence  
  39.     int n_comp = comp->total;  //total number of elements  
  40.   
  41.     forint i = 0; i < n_comp; ++i )  
  42.     {  
  43.         CvConnectedComp* cc = ( CvConnectedComp* )cvGetSeqElem( comp, i );  //connect the image  
  44.         //  
  45.     }  
  46.     cvReleaseMemStorage( &storage );  
  47. }  


/*结果*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛型参数转换的问题

泛型不同参数类型生成的对象是相互独立的。 //如 Tuple<string> ts; Tuple<object> to; //ts to 是两个类型的对象。很多时候&#xff0c;我们希望实现 to ts 这种操作&#xff0c;为什么&#xff1f;因为看上去它应该如此。 为了达到这个目的&#xff0c;就要解决…

【python数字信号处理】——循环卷积(也叫圆圈卷积)

目录 一、公式 二、代码 方法一:遍历 方法二:利用卷积定理 一、公式

UI-UIScrollView

- (void)viewDidLoad { [super viewDidLoad]; scrollView [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; scrollView.backgroundColor [UIColor redColor]; // 是否支持滑动最顶端 // scrollView.scrollsToTop NO; scrollView.delegate self; // 设…

[COCI2015]ZGODAN

题目大意&#xff1a;   给你一个数$n(n\leq10^1000)$&#xff0c;定义一个数是“美丽数”当且仅当这个数各个数位上的数奇偶性不同。   求最接近$n$的“美丽数”&#xff0c;若有多个&#xff0c;则依次输出。 思路&#xff1a;   贪心高精度。   首先找出$n$的第一个…

OpenCV学习笔记(三)——Mat,图像的新容器

自从版本2.0&#xff0c;OpenCV采用了新的数据结构&#xff0c;用Mat类结构取代了之前用extended C写的cvMat和lplImage&#xff0c;更加好用啦&#xff0c;最大的好处就是更加方便的进行内存管理&#xff0c;对写更大的程序是很好的消息。 需要注意的几点&#xff1a;1. Mat的…

jq实现事件委托

事件委托首 页产品展示公司简介关于我们联系我们转载于:https://www.cnblogs.com/haley168/p/eventTarget.html

【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件

目录 一、参考文献 1、scipy接口 2、scipy库介绍+IIR滤波器设计(含GUI)+绘制频谱响应

关于SQL查询效率,100w数据,查询只要1秒

原文:关于SQL查询效率&#xff0c;100w数据&#xff0c;查询只要1秒1.关于SQL查询效率&#xff0c;100w数据&#xff0c;查询只要1秒&#xff0c;与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比较两种查询的性能SQL查询效…

OpenCV学习笔记(五十四)——概述FaceRecognizer人脸识别类contrib

在最新版的2.4.2中&#xff0c;文档的更新也是一大亮点&#xff0c;refrence manual扩充了200多页的内容&#xff0c;添加了contrib部分的文档。contrib就是指OpenCV中新添加的模块&#xff0c;但又不是很稳定&#xff0c;可以认为是一个雏形的部分。这次结合refman的阅读&…

【调试】Linux下超强内存检测工具Valgrind

【调试】Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么&#xff1f;Valgrind的使用Valgrind详细教程1. Valgrind是什么&#xff1f; Valgrind是一套Linux下&#xff0c;开放源代码&#xff08;GPLV2&#xff09;的仿真调试工具的集合。Valgrind由内核&#xff08;c…

【python学习】——读取csv文件

file_name rD:\ParttimeJobs\MinistConfiguration\datas\mnist_train.csv # 数据集为42000张带标签的28x28手写数字图像y []x []y_t []x_t []with open(file_name, r) as f:reader csv.reader(f)header_row next(reader)# print(header_row)for row in reader:if np.ra…

机器学习实战(python)-Ch02KNN-Notes

Chapter2 KNN 1.numpy.tile函数 格式&#xff1a;tile&#xff08;A,reps&#xff09; * A&#xff1a;array_like * 输入的array * reps&#xff1a;array_like * A沿各个维度重复的次数 举例&#xff1a;A[1,2] 1. tile(A,2) 结果&#xff1a;[1,2,1,2] 2. tile(A,(2,3)) 结果…

猜1-10的数字python脚本

#!/usr/bin/python#coding:utf-8import randomnumrandom.randint(1,10)while True:caiint(raw_input(请输入随机数字:))if cai num:print 猜对了exit()elif cai > num:print 猜大了else:print 猜小了非交互式的cp脚本#!/usr/bin/python#coding:utf-8import sysfile1sys.arg…

惯量匹配和最佳传动比

惯量是刚体绕轴转动惯性的度量&#xff0c;转动惯量是表征刚体转动惯性大小的物理量。它是伺服选型的重要标准&#xff0c;如果惯量匹配不好&#xff0c;会导致电机运行不稳定。如小惯量电机制动性能好&#xff0c;运行反应速度快&#xff0c;适用于轻负载、高速定位的环境;而中…

【pyqt5学习】——滑动条的使用slider

1、获取滑动条当前值: 滑动条名称.value() self.threshold1 self.horizontalSlider.value() self.threahold2 self.horizontalSlider_2.value() 2、滑动条值改变信号绑定槽函数 滑动条名称.valueChanged.connect(槽函数&#xff09; # 滑条值变化 self.horizontalSlider.valu…

hibernate多对一单向外键

hibernate多对一单向外键&#xff1a; 描述&#xff1a; 转载于:https://www.cnblogs.com/blogofwyl/p/5402197.html

Spring在bean配置文件中定义电子邮件模板

在上一篇Spring电子邮件教程&#xff0c;硬编码的所有电子邮件属性和消息的方法体中的内容&#xff0c;这是不实际的&#xff0c;应予以避免。应该考虑在Spring bean 配置文件中定义电子邮件模板。1.Spring的邮件发件人Java类使用 Spring的MailSender接口发送电子邮件&#xff…

斐波那契数列规律的计算。

斐波那契数列就是某一个数&#xff0c;总是前两个数之和&#xff0c;比如0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8。由于输出是一串数字&#xff0c;可以用列表的结构存储。开始时&#xff0c;列表中有两个值&#xff0c;即0&#xf…

【PyQt5学习】——颜色面板使用(QcolorDialog)

from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * BB = QDialogButtonBox# 颜色窗口 class ColorDialog(QColorDialog):def __init__(self, parent=None):super(ColorDialog, self).__init__(parent)self.setOption(QColorDialog.ShowAlph…

PropertyPlaceholderConfigurer实现配置文件读取

PropertyPlaceholderConfigurer实现配置文件读取 PropertyPlaceholderConfigurer类的主要的用法是将BeanFactory里定义的内容放在一个.properties的文件中. PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现&#xff0c;也就是BeanFactoryPostProcessor接口的一个实…