图像金字塔及其在 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 算法相关函 ...
随机推荐
- 老男孩linux高级架构 百度云盘下载
关于Linux的资源我了解还是比较少的,因为我最讨厌用命令行了(那是我大学时代的阴影啊!).这个资源收集很久了一直没有分享出来,因为我对Linux的了解真的很少,不知道怎么去描述,但是今天分享出来我想 ...
- memached 服务器lru算法
1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...
- [Js]焦点图轮播效果
一.所用到的知识点 1.DOM操作 2.定时器 3.事件运用 4.Js动画 5.函数递归 6.无限滚动大法 二.结构和样式 <div id="banner" class=&q ...
- tab模块
#!/usr/bin/env python # python startup file import sys import readline import rlcompleter import ate ...
- localStorage
length:唯一的属性,只读,用来获取storage内的键值对数量. key:根据index获取storage的键名 getItem:根据key获取storage内的对应value setItem: ...
- 安装eclipse for c/c++环境
安装eclipse for c/c++环境: 1.启动eclipse, 2.选择Help->Install New Software...,在Work with的框框下复 ...
- CSS网页布局:网站整体居中 转
body{ margin:0 auto; padding:0 auto; text-align:center;} 只设置body属性对ie浏览器有效果,但是对火狐等不起作用 body{ ...
- java.lang包的分类
提供利用 Java 编程语言进行程序设计的基础类. 1> 最重要的类是 Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类). 2> 把基本类型 ...
- golang函数调用计时
package main import ( "log" "time" ) func f() { defer timeoutCheck("f slow& ...
- BZOJ 4562 食物链
我们需要拓扑一下. #include<iostream> #include<cstring> #include<cstdio> #include<algori ...