【练习5.11】图像分割、cvPyrSegmentagtion、图像金字塔

提纲
题目要求
程序代码
结果图片
要言妙道

题目要求:

载入一张风景图,执行cvPyrSegmentation操作

a、threshold1=threshold2=200

b、threshold1=200,threshold2=50

c、threshold1=200,threshold2=100

程序代码:

  1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
  2 //
  3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg
  4
  5
  6 #include "stdafx.h"
  7 #include <cv.h>
  8 #include <highgui.h>
  9 #include <iostream>
 10
 11 #include <opencv2/legacy/legacy.hpp>
 12 //#pragma comment(lib, "opencv_legacy2411.lib")
 13
 14 using namespace cv;
 15 using namespace std;
 16
 17 //函数声明-->--->-->--->-->--->-->--->//
 18
 19 bool IsCanBeUsedForImagePyramid(IplImage * img, uint32_t layerCount, int PyrType = 0);
 20
 21 //<--<--<--<--<--<--<--<--<--函数声明//
 22
 23
 24 int _tmain(int argc, _TCHAR* argv[])
 25 {
 26     const char * soutceFile = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第5章\\雪屋.jpg";
 27     IplImage * image_Resource = cvLoadImage(soutceFile, CV_LOAD_IMAGE_UNCHANGED);
 28     assert(image_Resource);
 29
 30     cvNamedWindow("原始图像", 0);
 31     cvNamedWindow("题目_a", 0);
 32     cvNamedWindow("题目_b", 0);
 33     cvNamedWindow("题目_c", 0);
 34
 35     IplImage * image_Gray = cvCreateImage(cvSize(image_Resource->width, image_Resource->height), IPL_DEPTH_8U, 1);
 36
 37     //使用cvCvtColor和cvCopy这些函数前,都应该对参数进行验证再使用
 38     if (image_Resource->nChannels != 3)
 39     {
 40         cout << "加载的图像必须为彩色图片" << endl;
 41         return 0;
 42     }
 43
 44     cvCvtColor(image_Resource, image_Gray, CV_RGB2GRAY);
 45
 46     cvShowImage("原始图像", image_Gray);
 47
 48     //---------------------------a:开始--------------------------------//
 49
 50     //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●/:
 51     //这次见证了这个函数的重要性,一个4912×2760的图片,很大,但是只适合≤三层的金字塔处理,到第四层已经不是偶数
 52     //如果并使用IsCanBeUsedForImagePyramid验证图片可用性,后面将在“cvPyrSegmentation”函数处报错
 53     //遇到调用OpenCV函数报错的时候,就去看官方说明或《学习OpenCV》或中文文档等全文文档的说明,一定是对函数调用有什么条件限制
 54     //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●/。
 55     bool isTheImageCanUse = IsCanBeUsedForImagePyramid(image_Gray, 4);
 56     if (isTheImageCanUse == false)
 57     {
 58         cout << "图片不可用" << endl;
 59         return 0;
 60     }
 61
 62     IplImage * image_Result_a = cvCloneImage(image_Gray);
 63     cvZero(image_Result_a);
 64
 65     CvMemStorage * storage = cvCreateMemStorage(0);
 66     CvSeq *comp = NULL;
 67     cvPyrSegmentation(image_Gray, image_Result_a, storage, &comp,1, 200, 200);
 68
 69     cvShowImage("题目_a", image_Result_a);
 70
 71     //---------------------------a:结束--------------------------------//
 72
 73     //---------------------------b:开始--------------------------------//
 74
 75     IplImage * image_Result_b = cvCloneImage(image_Gray);
 76     cvZero(image_Result_b);
 77
 78     storage = cvCreateMemStorage(0);
 79     comp = NULL;
 80     cvPyrSegmentation(image_Gray, image_Result_b, storage, &comp, 1, 200, 50);
 81
 82     cvShowImage("题目_b", image_Result_b);
 83
 84     //---------------------------b:结束--------------------------------//
 85
 86     //---------------------------c:开始--------------------------------//
 87
 88     IplImage * image_Result_c = cvCloneImage(image_Gray);
 89     cvZero(image_Result_c);
 90
 91     storage = cvCreateMemStorage(0);
 92     comp = NULL;
 93     cvPyrSegmentation(image_Gray, image_Result_c, storage, &comp, 1, 200, 100);
 94
 95     cvShowImage("题目_c", image_Result_c);
 96
 97     //---------------------------c:结束--------------------------------//
 98
 99     cvWaitKey(0);
100
101     cvReleaseImage(&image_Resource);
102     cvReleaseImage(&image_Result_a);
103     /*cvReleaseImage(&imgCopy_b);
104     cvReleaseImage(&imgCopy_c);*/
105
106     cvDestroyWindow("原始图像");
107     cvDestroyWindow("题目_a");
108     cvDestroyWindow("题目_b");
109     cvDestroyWindow("题目_c");
110
111     return 0;
112 }
113
114 //cvPyrType表示操作类型,cvPyrDown和cvPyrUp,0代表cvPyrDown和cvPyrSetmentation,暂时只针对cvPyrDown判断层数。相关参数见书中对cvPyrSetmentation的说明
115 bool IsCanBeUsedForImagePyramid(IplImage * img, uint32_t layerCount, int PyrType)
116 {
117     int imgWidth = img->width;
118     int imgHeight = img->height;
119
120     if (imgWidth % 2 != 0 || imgHeight % 2 != 0)
121     {
122         return false;
123     }
124
125     uint32_t tempWidth = imgWidth / 2;
126     uint32_t tempHeight = imgHeight / 2;
127     uint32_t canUsedCount = 0;
128
129     while (tempWidth % 2 == 0)
130     {
131         canUsedCount++;
132         tempWidth = tempWidth / 2;
133     }
134
135     if (canUsedCount < layerCount)
136     {
137         return false;
138     }
139
140     canUsedCount = 0;
141
142     while (tempHeight % 2 == 0)
143     {
144         canUsedCount++;
145         tempHeight = tempHeight / 2;
146     }
147
148     if (canUsedCount < layerCount)
149     {
150         return false;
151     }
152
153     return true;
154 }

结果图片:

要言妙道:

①使用cvPyrSegmentation函数的时候见证使用IsCanBeUsedForImagePyramid验证图像的重要性,特别是金字塔层数比较多的时候

②threshold1:建立连接的错误阈值,当一些值小于这个值时就把这些值相连结;threshold2:分割簇的错误阈值,当一些值小于这个值时就把这些值当做是一个区域,所以

③使用cvPyrSegmentation函数,必须加入#include <opencv2/legacy/legacy.hpp>,另附加依赖项可以使用一行代码代替,见下图

时间: 2024-10-01 10:06:41

【练习5.11】图像分割、cvPyrSegmentagtion、图像金字塔的相关文章

图像金字塔及其在 OpenCV 中的应用范例(下)

前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程.图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析.[1]图像分割通常用于定位图像中的物体和边界(线,曲线等).更精确的,图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性. 图像分

图像金字塔及其在 OpenCV 中的应用范例(上)

前言 图像金字塔是计算机图形学中非常重要的一个概念. 本文将详细介绍这个概念,以及它的实现与应用. 图像金字塔的定义 图像金字塔是一组图像的集合,集合中的所有图像都是通过对某一图像连续降采样得到的一组图像序列. 有两种经典的金字塔:高斯金字塔和拉普拉斯金字塔,前者采用向下采样,后者是向上采样需要的缺失的信息. 向下采样(生成高斯金字塔)的具体操作为: 1. 对图像进行高斯卷积 2. 删除所有的偶数行和偶数列 向上采样的缺失信息(生成拉普拉斯金字塔)的具体操作为: 1. 首先将维数扩大两倍 2.

【转】图像金字塔PyrDown,PyrUP

原文链接:http://blog.csdn.net/davebobo/article/details/51885043 [图像金字塔] 图像金字塔这个词,我们经常在很多地方可以看到.它是图像多尺度表达的一种,最主要的是用于图像的分割.同时,图像金字塔也被广泛用于各种视觉应用中. 图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而是通过对原始图像连续降采样获得,直到达到某个终止条件才停止降采样.我们可以通过下图来形象的说明图像金字塔的概念.在金字塔的底部是待处理图像的高分辨率表示,

[转]OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

[OpenCV入门教程之十三]OpenCV图像金字塔:高斯金字塔.拉普拉斯金字塔与图片尺寸缩放 2014-05-18 18:58 36007人阅读 评论(54) 收藏 举报 本文章已收录于:  OpenCV知识库 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http

【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 这篇文章里,我们将一起探讨图像金字塔的一

图像金字塔与图片尺寸缩放

一.图像金字塔 二.尺寸调整:resize()函数 1 void resize( InputArray src, OutputArray dst, 2 Size dsize, double fx = 0, double fy = 0, 3 int interpolation = INTER_LINEAR ); 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 4 using namespace cv; 5 using nam

Python图像处理(16):图像金字塔

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样.金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似.层级越高,则图像越小,分辨率越低. 一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中.他们分别是: 高斯金字塔

图像金字塔

      图像金字塔被广泛用于各种视觉应用中.图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样.(当然,降为一个像素肯定是中止条件.) 有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔低层图像中向上采样重建一个图像. 要从金字塔第 i 层生成第i+1 层,我们先要用高斯核对第i 层进行卷积,然后删除所有偶数行和偶数列.当然,新得到的图像面积会变为源图像的

OpenCV笔记(十)——图像金字塔

图像金字塔(Image Pyramids)可以用来处理图像的缩放. 有两种广为使用的图像金字塔:高斯金字塔和拉普拉斯金字塔. 这里介绍高斯金字塔. 高斯金字塔有两种操作:upsample和downsample,可以理解为图像的放大和缩小. 以下图为例: 图像如果downsample,则col和row均变成之前的1/2,图像的面积也为之前的1/4.等价于金字塔的层数升高一层,面积为先前的四分之一. 如果是upsample,则col和row均是之前的2倍,则图像面积为之前的4倍.等价于金字塔下降一层

OpenCV图像金字塔

图像金字塔 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样. 原理 Note 以下内容来自于Bradski和Kaehler的大作: Learning OpenCV . 当我们需要将图像转换到另一个尺寸的时候, 有两种可能: 放大 图像 或者 缩小 图像. 尽管OpenCV 几何变换 部分提供了一个真正意义上的图像缩放函数(resize, 在以后的教程中会学到),不过在本篇我们首先学习一下使用 图像金字塔来做图像缩放, 图像金字塔