基于OpenCV和C++实现最大阈值分割算法
2017-02-24 17:55
471 查看
代码如下::
/**********************************************************************************************************
*文件说明:
* 基于OpenCv的阈值分割算法
*开发环境:
* win7+vs2010+opencv2.4.8
*时间地点:
* 陕西师范大学.2017.2。19
*作 者:
* 李丽
***********************************************************************************************************/
#include<opencv2/opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace cv;
/***********************************************************************************************************
宏定义
***********************************************************************************************************/
int HistogramBins = 256;
float HistogramRange1[2] = {0,255};
float *HistogramRange[1] = {&HistogramRange1[0]};
typedef enum {back,object} entropy_state;
/***********************************************************************************************************
// 计算当前位置的阈值
***********************************************************************************************************/
double caculateCurrentEntropy(CvHistogram * Histogram1, int cur_threshold, entropy_state state)
{
int i,start,end;
if(state == back)
{
start = 0;
end = cur_threshold;
}
else
{
start = cur_threshold;
end = 256;
}
int total = 0;
for(int i = start; i < end; i++)
{
total += (int)cvQueryHistValue_1D(Histogram1, i); //cvQueryHistValue_1D()函数是访问直方图的方式
}
double cur_entropy = 0.0;
for(i = start; i < end; i++)
{
if((int)cvQueryHistValue_1D(Histogram1,i) == 0)
continue;
float percentage = cvQueryHistValue_1D(Histogram1, i) / total;
cur_entropy += - percentage * logf(percentage); // 能量的定义公式
}
return cur_entropy;
}
/***********************************************************************************************************
// 寻找最大熵阈值并分割
***********************************************************************************************************/
void MaxEntropy(IplImage *src, IplImage *dst)
{
CvHistogram * hist = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY, HistogramRange); //OpenCV中直方图的 CvHistogram数据类型的理解
cvCalcHist(&src, hist); //创建直方图
double maxentropy = -1.0; ////???
int max_index = -1; ////???
// 循环测试每个分割点,寻找到最大的阈值分割点
for(int i = 0; i < HistogramBins; i++) // int HistogramBins = 256;
{
double cur_entropy = caculateCurrentEntropy(hist, i, object) + caculateCurrentEntropy(hist, i, back);
if(cur_entropy > maxentropy)
{
maxentropy = cur_entropy;
max_index = i;
}
}
cvThreshold(src, dst, (double)max_index, 255, CV_THRESH_BINARY);
cvReleaseHist(&hist);
}
/***********************************************************************************************************
// 主函数 控制台应用程序入口
***********************************************************************************************************/
int main()
{
IplImage* src = cvLoadImage("G:\\C++Study\\Demo\\MaxETG\\MaxETG\\lena.png",CV_LOAD_IMAGE_GRAYSCALE ); //CV_LOAD_IMAGE_GRAYSCALE
cvNamedWindow("Image", 1);
cvNamedWindow("origin", 1);
IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
MaxEntropy(src, dst); //关键函数调用---求最大熵阈值分割结果
cvShowImage("Image", dst); // 显示图像
cvShowImage("origin", src);
cvWaitKey(0); // 等待按键
cvDestroyWindow("Image"); // 销毁窗口
cvDestroyWindow("origin");
cvReleaseImage(&src); // 释放图像
cvReleaseImage(&dst);
return 0;
}
运行结果如下: 左边为原始图像 右边为最大熵阈值分割函数处理之后的函数
/**********************************************************************************************************
*文件说明:
* 基于OpenCv的阈值分割算法
*开发环境:
* win7+vs2010+opencv2.4.8
*时间地点:
* 陕西师范大学.2017.2。19
*作 者:
* 李丽
***********************************************************************************************************/
#include<opencv2/opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace cv;
/***********************************************************************************************************
宏定义
***********************************************************************************************************/
int HistogramBins = 256;
float HistogramRange1[2] = {0,255};
float *HistogramRange[1] = {&HistogramRange1[0]};
typedef enum {back,object} entropy_state;
/***********************************************************************************************************
// 计算当前位置的阈值
***********************************************************************************************************/
double caculateCurrentEntropy(CvHistogram * Histogram1, int cur_threshold, entropy_state state)
{
int i,start,end;
if(state == back)
{
start = 0;
end = cur_threshold;
}
else
{
start = cur_threshold;
end = 256;
}
int total = 0;
for(int i = start; i < end; i++)
{
total += (int)cvQueryHistValue_1D(Histogram1, i); //cvQueryHistValue_1D()函数是访问直方图的方式
}
double cur_entropy = 0.0;
for(i = start; i < end; i++)
{
if((int)cvQueryHistValue_1D(Histogram1,i) == 0)
continue;
float percentage = cvQueryHistValue_1D(Histogram1, i) / total;
cur_entropy += - percentage * logf(percentage); // 能量的定义公式
}
return cur_entropy;
}
/***********************************************************************************************************
// 寻找最大熵阈值并分割
***********************************************************************************************************/
void MaxEntropy(IplImage *src, IplImage *dst)
{
CvHistogram * hist = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY, HistogramRange); //OpenCV中直方图的 CvHistogram数据类型的理解
cvCalcHist(&src, hist); //创建直方图
double maxentropy = -1.0; ////???
int max_index = -1; ////???
// 循环测试每个分割点,寻找到最大的阈值分割点
for(int i = 0; i < HistogramBins; i++) // int HistogramBins = 256;
{
double cur_entropy = caculateCurrentEntropy(hist, i, object) + caculateCurrentEntropy(hist, i, back);
if(cur_entropy > maxentropy)
{
maxentropy = cur_entropy;
max_index = i;
}
}
cvThreshold(src, dst, (double)max_index, 255, CV_THRESH_BINARY);
cvReleaseHist(&hist);
}
/***********************************************************************************************************
// 主函数 控制台应用程序入口
***********************************************************************************************************/
int main()
{
IplImage* src = cvLoadImage("G:\\C++Study\\Demo\\MaxETG\\MaxETG\\lena.png",CV_LOAD_IMAGE_GRAYSCALE ); //CV_LOAD_IMAGE_GRAYSCALE
cvNamedWindow("Image", 1);
cvNamedWindow("origin", 1);
IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
MaxEntropy(src, dst); //关键函数调用---求最大熵阈值分割结果
cvShowImage("Image", dst); // 显示图像
cvShowImage("origin", src);
cvWaitKey(0); // 等待按键
cvDestroyWindow("Image"); // 销毁窗口
cvDestroyWindow("origin");
cvReleaseImage(&src); // 释放图像
cvReleaseImage(&dst);
return 0;
}
运行结果如下: 左边为原始图像 右边为最大熵阈值分割函数处理之后的函数
相关文章推荐
- 直方图均衡化的 C++ 实现(基于 openCV)
- 基于VS C++平台的OpenCV设置,实现简单的行人检测
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- DCT变换及量化的c++实现(基于opencv矩阵运算)
- C++基于OpenCV实现实时监控和运动检测记录
- C++实现的带最大最小线程数的线程池(基于ACE)
- 基于C++实现kinect+opencv 获取深度及彩色数据
- 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- SIFT特征2-基于OpenCV和C++的算法实现
- 连通区域标记:c++版的bwlabel实现(基于opencv)
- 图像卷积操作的手动实现(基于opencv的C++编译环境)
- 基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
- 基于OpenCV的人脸检测——C++和Python实现
- 匈牙利算法的C++实现(基于OpenCV)
- LLC(Locality-constrained Linear Coding)基于OpenCV的C++源码实现
- C++实现的带最大最小线程数的线程池(基于ACE)
- 混合空间增强法(基于OpenCV的C++实现)
- 基于AR模型谱估计算法(Yule-Walker方法与Burg方法)的C++实现