图像金字塔及其在 OpenCV 中的应用范例(下)
前言
本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用。
关于图像分割
在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程。图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析。[1]图像分割通常用于定位图像中的物体和边界(线,曲线等)。更精确的,图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性。
图像分割的结果是图像上子区域的集合(这些子区域的全体覆盖了整个图像),或是从图像中提取的轮廓线的集合(例如边缘检测)。一个子区域中的每个像素在某种特性的度量下或是由计算得出的特性都是相似的,例如颜色、亮度、纹理。邻接区域在某种特性的度量下有很大的不同。 [1]
------ 维基百科
以下是一位网友对图像分割技术的一个看法,也挺值得借鉴:
从学术角度讲图像分割主要分成3大类,一是基于边缘的,二是基于区域的,三是基于纹理的。由于基于纹理的也可以看成是基于区域的,所以有些专家也把分割方法分成基于边缘和基于区域两大类。选择算法的时候主要参考你要分割的图像样本的特点。
如果图像的边界特别分明,比如绿叶和红花,在边界处红绿明显不同,可以精确提取到边界,这时候用基于边缘的方法就可行。但如果是像医学图像一样,轮廓不是特别明显,比如心脏图像,左心房和左心室颜色比较接近,它们之间的隔膜仅仅是颜色比它们深一些,但是色彩上来说很接近,这时候用基于边缘的方法就不合适了,用基于区域的方法更好。再比如带纹理的图像,例如条纹衫,如果用基于边缘的方法很可能就把每一条纹都分割成一个物体,但实际上衣服是一个整体,这时候用基于纹理的方法就能把纹理相同或相似的区域分成一个整体。
不过总体来说,基于区域的方法近些年更热一些,如Meanshift分割方法、测地线活动轮廓模型、JSEG等。
------ 某位网友
金字塔图像分割函数 - cvPyrSegmentation()
实现原理步骤:
1. 建立一个图像金字塔
2. 在金字塔 Gi 层和 Gi+1层之间建立父子关系
3. 由分辨率低的层次向分辨率高的层次逐层分割,优化。
函数原型:
void cvPyrSegmentation(
IplImage* src, // 输入图像
IplImage* dst, // 输出图像
CvMemStorage* storage, // 这个参数和下个参数用来管理关于分割结果的一些细致信息
CvSeq** comp,
int level, // 金字塔等级
double threshold1, // 建立连接的错误阈值
double threshold2 // 分割簇的错误阈值
);
参数特别说明:
1. 输入图像的长和宽必须能够被 2 整除,并且能够被 2 整除的次数不少于金字塔总的层数。
2. 关于参数 storage 和 comp,将在以后的文章中结合具体开发例子来介绍。
参考示例代码:
// 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h"
// 使用 cvPyrSegmentation 分割函数需要包含此头文件
#include <opencv2/legacy/legacy.hpp> #include <iostream>
using namespace std; // 分割图像
bool doPyrSegmentation( IplImage * src ,IplImage * dst)
{
// 检查处理图像大小是否符合规格 (规格的解释见下)
if (!(src->width% == && src->height% == ))
return false; // 定义分割参数
int level = ;
double threshold1 = ;
double threshold2 = ;
CvMemStorage * stoage = cvCreateMemStorage() ;
CvSeq* comp=NULL; // 分割
cvPyrSegmentation(src,dst, stoage,&comp,level, threshold1,threshold2); return true;
}; int main(int argc,char ** argv)
{
IplImage * src = cvLoadImage("d:\\1.jpg"); IplImage * dst= cvCreateImage(cvGetSize(src), src->depth,src->nChannels); if (!doPyrSegmentation(src,dst)) {
return EXIT_FAILURE;
} cvNamedWindow("分割前") ;
cvNamedWindow("分割后") ;
cvShowImage("分割前",src);
cvShowImage("分割后",dst); cvWaitKey() ; // 清理内存
cvDestroyAllWindows(); return ;
}
运行结果:
小结
本文具体讲述了用 OpenCV 进行图像分割的一个例子。至于如何获取分割的具体结果进行后续开发,则是以后讨论的内容。
图像金字塔及其在 OpenCV 中的应用范例(下)的更多相关文章
- 图像金字塔及其在 OpenCV 中的应用范例(上)
前言 图像金字塔是计算机图形学中非常重要的一个概念. 本文将详细介绍这个概念,以及它的实现与应用. 图像金字塔的定义 图像金字塔是一组图像的集合,集合中的所有图像都是通过对某一图像连续降采样得到的一组 ...
- opencv中的meanshift图像切割
Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法.Meanshift不仅能够用于图像滤波,视频跟踪,还能够用于图像切割. 通过给出一组多维数据点,其维数是(x,y,r ...
- Atitit 图像金字塔原理与概率 attilax的理解总结qb23
Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔 ( Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...
- 【转】图像金字塔PyrDown,PyrUP
原文链接:http://blog.csdn.net/davebobo/article/details/51885043 [图像金字塔] 图像金字塔这个词,我们经常在很多地方可以看到.它是图像多尺度表达 ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- OpenCV探索之路(五):图片缩放和图像金字塔
对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用 ...
- [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)
部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...
- [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)
部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...
随机推荐
- Windows server2003 + sql server2005 集群配置安装
http://blog.itpub.net/29500582/viewspace-1249319/
- 使用BroadcastReceiver监听系统接收的短信
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Inten ...
- 小记:获取系统时间的long值,格式化成可读时间。
/** * 返回的字符串形式是形如:2013年10月20日 20:58 * */ public static String formatTimeInMillis(long timeInMillis) ...
- [Jquery]焦点图轮播效果
$(function(){ var $next=$(".right"); var $prev=$(".left"); var $list_nu ...
- 二模 (4) day1
第一题: 题目描述: 有一个无穷序列如下:110100100010000100000…请你找出这个无穷序列中指定位置上的数字 解题过程: 1.考虑到1的数目比0少的多,就从1的位置的规律开始分析.前几 ...
- Android 时间戳的转换
在Android应用中,经常会碰到后台的时间是时间戳而现实的需要今天什么时候,昨天什么时候,就像微博的时间显示一样.现在我上一个把时间戳转换的代码: public static String getT ...
- DotNetBar v12.3.0.3 Fully Cracked
PS: 博客园的程序出现问题,导致我的博客不能访问(转到登录页),而我自己由于 Cookies 问题,一直可以访问,所以一直未发现该问题. 感谢冰河之刃告知,thx! 更新信息: http://www ...
- 通过使用ScriptManager.RegisterStartupScript,呈现后台多次使用alert方法
在前台HTML中加入alert或者confirm,相信大家已经非常熟悉并且经常使用: <div onclick="alert('hello')">按钮1</div ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...
- WordPress 4.0 “Benny” 正式发布
http://wordpress.org/news/2014/09/benny/Highlights and What’s New:http://codex.wordpress.org/Version ...