OpenCV编程案例:最大熵阈值分割算法实现
2010-01-13 11:54
483 查看
http://www.aiseminar.cn/?action-viewthread-tid-700
下面程序使用OpenCV的相关函数,实现了最大熵阈值分割算法。作者为crond123,本人在自己的运行过程中,根据错误提示进行相应修改,并在下面图像上运行试验。
程序maxentropythreshold.cpp源码如下:
CODE:
apple.jpg
结果为:
apple1.JPG
apple2.JPG
参考文献:
[1] crond123. 最大熵阈值分割算法的C语言实现[EB/OL]. http://blog.csdn.net/crond123/archive/2009/03/03/3952597.aspx, 2009-03-03/2009-11-19
下面程序使用OpenCV的相关函数,实现了最大熵阈值分割算法。作者为crond123,本人在自己的运行过程中,根据错误提示进行相应修改,并在下面图像上运行试验。
程序maxentropythreshold.cpp源码如下:
CODE:
/*================================================================== = 代码内容:最大熵阈值分割 = 修改日期:2009-3-3 = 作者:crond123 = 博客:http://blog.csdn.net/crond123/ = E_Mail:crond123@163.com = 修改:jink2005 = 论坛:http://www.aiseminar.cn/bbs ====================================================================*/ #include "cv.h" #include "highgui.h" #include <iostream> #pragma comment(lib, "highgui.lib") #pragma comment(lib, "cv.lib") #pragma comment(lib, "cvaux.lib") #pragma comment(lib, "cxcore.lib") 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 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); } double cur_entropy = 0.0; for(i = start; i < end; i++) { if((int)cvQueryHistValue_1D(Histogram1,i) == 0) continue; double percentage = cvQueryHistValue_1D(Histogram1, i) / total; cur_entropy += - percentage * logf(percentage); // 能量的定义公式 } return cur_entropy; } // 寻找最大熵阈值并分割 void MaxEntropy(IplImage *src, IplImage *dst) { assert(src != NULL); assert(src->depth == 8 && dst->depth == 8); assert(src->nChannels == 1); CvHistogram * hist = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY, HistogramRange); cvCalcHist(&src, hist); double maxentropy = -1.0; int max_index = -1; // 循环测试每个分割点,寻找到最大的阈值分割点 for(int i = 0; i < HistogramBins; i++) { 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(int argc, char* argv[]) { IplImage* src; //声明IplImage指针 // 载入图像 if( argc == 2 && (src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE)) != 0 ) ; else // 如果无参数,载入工作目录下文件名为apple.jpg的图片。 { src = cvLoadImage("apple.jpg", CV_LOAD_IMAGE_GRAYSCALE); } if(src == NULL) { std::cout << "Can't find the image file!" << std::endl; return -1; } 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; }运行中使用图像如下:
apple.jpg
结果为:
apple1.JPG
apple2.JPG
参考文献:
[1] crond123. 最大熵阈值分割算法的C语言实现[EB/OL]. http://blog.csdn.net/crond123/archive/2009/03/03/3952597.aspx, 2009-03-03/2009-11-19
相关文章推荐
- OpenCV编程:最大熵阈值分割算法实现(代码可运行)
- 最大熵阈值分割——opencv与matlab实现
- 一维最大熵阈值分割算法的C语言实现
- 一维最大熵阈值分割——opencv与matlab实现
- 最大熵阈值分割算法的C语言实现
- 二维最大熵阈值分割原理与opencv实现
- OpenCV编程案例:实现一个双目摄像头图像显示的程序
- 编程之美上的寻找最大的前k个数的算法实现
- CamShift算法,OpenCV实现(3):CamShift算法
- 程序员编程艺术:Top K算法问题的实现
- 求所有最大公共子序列的算法实现(转)
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- OpenCV中图像旋转(warpAffine)算法的实现过程
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
- C语言之linux内核实现最大公约数算法
- 匈牙利算法求最大匹配的代码实现
- 堆排序原理及算法实现(最大堆)
- CamShift算法,OpenCV实现1–Back Projection (转载)
- 基于算法导论6.5用最大堆实现的优先队列(C++)