第五章 - 图像形态学 - 基于图像金字塔的图像分割(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,一经查实,立即删除!

相关文章

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

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

机器学习实战(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…

【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

【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…

算法练习5---快速排序Java版

基本思想&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以递归进行&#xff0c;以此达到整个数据变成有序序…

PostCSS自学笔记(二)【番外篇二】

图解PostCSS的插件执行顺序 文章其实是一系列的早就写完了. 才发现忘了发在SegmentFault上面, 最早发布于https://gitee.com/janking/Inf... 这次我继续研究PostCSS的插件的执行顺序。 之前有研究过做过假设&#xff0c;在插件列表中&#xff0c;PostCSS的插件执行顺序自上而下…

linux命令详解——iostat

简介 iostat主要用于监控系统设备的IO负载情况&#xff0c;iostat首次运行时显示自系统启动开始的各项统计信息&#xff0c;之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 安装 yum install -y sysstat 语法 i…

highgui基础 OpenCV trackbar

在调试程序或者程序执行时需要调整某个变量的值亦或是参数的值&#xff0c;我们需要一个简单方便的操作&#xff0c;滚动条就是一个非常使用的工具。通过鼠标点击对滚动条进行拖动操作以期实现调整某个参数的值。下面例程参见Opencv 安装目录 samples tutorial_code文件夹。 #i…

chrome浏览器开发模式实现跨域

2019独角兽企业重金招聘Python工程师标准>>> 增加如下参数&#xff0c; --disable-web-security --user-data-dir 启动项变为&#xff1a; "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir 转载于…

C#替换字符串起始/结尾指定的字符串

#region 替换字符串起始位置(开头)中指定的字符串/// <summary> /// 替换字符串起始位置(开头)中指定的字符串 /// </summary> /// <param name"s">源串</param> /// <param name"searchStr">查找的串</param> /…

腐蚀函数cvErode 和 膨胀函数cvDilate

Erode腐蚀&#xff0c; Dilate膨胀&#xff0c;这两个形态学函数总是成对出现&#xff0c;前者可以消除较小的点如噪音&#xff0c;后者可以使不连通的图像合并成块。 void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* elementNULL, int iterations1 ); void cvDi…

Zookeeper和分布式环境中的假死脑裂问题(转)

Zookeeper和分布式环境中的假死脑裂问题 最近和同事聊天无意间发现他们的系统也存在脑裂的问题。想想当初在我们的系统中为了解决脑裂花了非常大的功夫&#xff0c;现在和大家一起讨论下脑裂&#xff0c;假死等等这些问题和解决的方法。 在一个大集群中往往会有一个master存在…

安全

2019独角兽企业重金招聘Python工程师标准>>> 1、不要使用页面变量进行传递值&#xff0c;用session 转载于:https://my.oschina.net/u/2277088/blog/1621841

3D打印材料PLA,ABS对比

转载于:https://www.cnblogs.com/sztom/p/6373910.html

【pyqt5学习】——控件绑定槽函数的同时利用lambda实现传参

两种方法&#xff1a; 1、利用pyqtsignal的emit进行传参 2、connect函数进行传参 self.pushButton.clicked.connect(lambda:self.readZodiacByButtonText(self.pushButton.text())) # 根据按钮上的文字来进行阅读def readZodiacByButtonText(self,text):if self.language &…

lab3

lamp: 在阿里云linux&#xff08;Ubuntu&#xff09;上安装Apache mysql php &#xff1a; apt-get install mysql_server mysql_client php5 php_mysql apache2 系统会提示正确的包的名称 安装ECShop 在本地命令行 scp ecshop.zip rootxxx.xxx.xx.xxx:/var/www/ 把压缩文件拷贝…

【python学习】——pyttsx3库实现文本朗读、音量、音速等调节

import pyttsx3# 初始化朗读引擎 engine pyttsx3.init() # 设置朗读速度 self.engine.setProperty(rate, 120) # text为需要读取的内容 self.engine.say(text) # 不添加下面这句&#xff0c;没有声音 self.engine.runAndWait()pyttsx3其他应用&#xff1a; python pyttsx3实现…

【pyqt5学习】——添加菜单栏动作action,给动作触发triggered绑定事件

1、打开qt-designer工具——视图——勾选上动作编辑器 2、勾选后右下方会出现动作编辑器栏 3、在改面板可以进行已有动作的属性编辑&#xff0c;也可以添加新的动作 4、 鼠标左键选中动作不松开&#xff0c;可以将动作拖到菜单栏 5、给动作绑定事件 self.saveLog.triggered.co…