Otsu阈值化
2015-12-06 12:25
387 查看
1979年日本大津展之提出了Otsu阈值法,他根据类间方差最大将灰度图分为目标和背景。
方法如下:
若一张灰度图有n个像素, 取阈值为t, 小于t的个数为n1, 大于t的个数为n2, 小于t的像素平均值为m1, 大于t的像素平均值为m2, 权重w1 = n1 / n, w2 = n2 / n,
类间方差 = w1 * w2 * (m1 - m2) ^ 2
遍历每一个阈值,计算每一个类间方差,使类间方差最大的阈值,即为所求阈值。
方法如下:
若一张灰度图有n个像素, 取阈值为t, 小于t的个数为n1, 大于t的个数为n2, 小于t的像素平均值为m1, 大于t的像素平均值为m2, 权重w1 = n1 / n, w2 = n2 / n,
类间方差 = w1 * w2 * (m1 - m2) ^ 2
遍历每一个阈值,计算每一个类间方差,使类间方差最大的阈值,即为所求阈值。
#include "cv.h" #include "highgui.h" int Otsu(CvMat*gray); int main() { IplImage* src = cvLoadImage("flower.jpg"); const int WIDTH = src->width; const int HEIGHT = src->height; CvMat* gray = cvCreateMat(HEIGHT, WIDTH, CV_8UC1); cvCvtColor(src, gray, CV_BGR2GRAY); int thres = Otsu(gray); cvThreshold(gray, gray, thres, 255, CV_THRESH_BINARY); cvShowImage("SRC", src); cvShowImage("GRAY", gray); cvWaitKey(0); cvCvtColor(gray, src, CV_GRAY2BGR); cvSaveImage("dst.bmp", src); cvReleaseMat(&gray); return 0; } int Otsu(CvMat*gray) { const int width = gray->width; const int height = gray->height; int histData[256] = {0}; for (int j = 0; j < height; j ++) { uchar*data = (uchar*)(gray->data.ptr + j * gray->step); for(int i = 0; i < width; i ++) { histData[data[i]]++; } } int total = width * height; float sum = 0; for (int i = 0 ; i < 256 ; i ++) sum += i * histData[i]; float sumB = 0; int wB = 0; int wF = 0; float varMax = 0; int threshold = 0; for (int i = 0 ; i < 256 ; i ++) { wB += histData[i]; if (wB == 0) continue; wF = total - wB; if (wF == 0) break; sumB += (float) (i * histData[i]); float mB = sumB / wB; float mF = (sum - sumB) / wF; float varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF); if (varBetween > varMax) { varMax = varBetween; threshold = i; } } return threshold; }源图和效果图如下:
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验
- 关于OpenCv图像变换与基本图形检测
- "应用程序正常初始化失败"-0xc0150002 解决办法
- OpenCV->HSV色彩空间
- opencv 内存泄露
- OpenCV函数cvFindContours
- OpenCV 2.3.1图像文件的读入和显示
- opencv2 矩阵方式 resize图像缩放代码