《opencv学习》 之 OTSU算法实现二值化
主要讲解OTSU算法实现图像二值化:
1.统计灰度级图像中每个像素值的个数。
2.计算第一步个数占整个图像的比例。
3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就是分别计算背景和前景下第一步和第二步的 和)。
4.比较第三步前景和背景之间方差,找到最大的一个确定为选定的阈值。
OTSU源码:
1 #include <opencv2/opencv.hpp>
#include <iostream>
#include <windows.h> using namespace cv;
using namespace std; int OTSU(Mat& src);
int main(int argc, char**argv)
{
Mat input_image;
input_image = imread("1.jpg"); if (input_image.data == NULL) {
return -; cout << "can't open image.../";
}
cvtColor(input_image, input_image, CV_BGR2GRAY);
const int thre_num = OTSU(input_image);
const int height = input_image.rows;
const int width = input_image.cols;
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
input_image.at<uchar>(i, j) = input_image.at<uchar>(i, j) >= thre_num ? : ;
}
}
imshow("input_image2", input_image);
waitKey();
return ;
} int OTSU(Mat& src)
{
const int height = src.rows;
const int width = src.cols;
int nCountPix[] = { };//数量
int nProPix[] = { };//概率
//------------统计像素点个数------------//
for (size_t i = ; i < height; i++)
{
for (size_t j = ; j < width; j++)
{
nCountPix[src.at<uchar>(i, j)]++;
}
}
//-------统计每个像素个数占得比例------//
for (size_t i = ; i < ; i++)
{
nProPix[i] = nCountPix[i] / (height*width);
}
double var_max = ;//设置一个参数,作为比较结果
int threashold = ;
for (size_t i = ; i < height; i++)
{
//----数量count、概率probility、平均概率average、方差variance----//
double c0 = , c1 = , p0 = , p1 = , a0 = , a1 = , var = ;
for (size_t j = ; j < width; j++)
{
//----前景和背景的计算
if (i < j)//背景
{
c0 += nCountPix[j];//总数量
p0 += nCountPix[j] * nProPix[j];//总概率
}
else//前景
{
c1 += nCountPix[j];//总数量
p1 += nCountPix[j] * nProPix[j];//总概率
}
}
a0 = p0 / c0;
a1 = p1 / c1;
var = static_cast<double>(c0*c1*pow((a0 - a1), )); if (var > var_max)
{
var_max = var;
threashold = i;
}
}
return threashold;
}


《opencv学习》 之 OTSU算法实现二值化的更多相关文章
- [iOS OpenCV的使用,灰度和二值化]
看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使 ...
- Python+OpenCV图像处理(十)—— 图像二值化
简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 一.普通图像二值化 代码如下: import cv2 as cv import numpy ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- 10、OpenCV Python 图像二值化
__author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)---------- ...
- 二值化函数cvThreshold()参数CV_THRESH_OTSU的疑惑【转】
查看OpenCV文档cvThreshold(),在二值化函数cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max ...
- c#数字图像处理(二)彩色图像灰度化,灰度图像二值化
为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上.24位彩色图像每个像素用3个字节表示,每个字节对应着R.G.B分量的亮度(红.绿 ...
- C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)
C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- Opencv实现图像的灰度处理,二值化,阀值选择
前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...
随机推荐
- Arpa’s obvious problem and Mehrdad’s terrible solution 思维
There are some beautiful girls in Arpa’s land as mentioned before. Once Arpa came up with an obvious ...
- JQuery输入框获取/失去焦点行为
//搜索框获取焦点清除内容 $(function() { $("input").focus(function() { //获取焦点,清空默认内容 $(this).css('colo ...
- ACM常用算法
数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维 ...
- 【转】python3中bytes和string之间的互相转换
问题: 比对算法测试脚本在python2.7上跑的没问题,在python3上报错,将base64转码之后的串打印出来发现,2.7版本和3是不一样的:2.7就是字符串类型的,但是3是bytes类型的,形 ...
- matplotlib-------标记特殊点
import matplotlib.pyplot as plt import numpy as np def demo_test(): a=np.array([0.15,0.16,0.14,0.17, ...
- http-equiv 了解
META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之间,它提供用户不可见的信息.meta标签通常用来为搜索引擎r ...
- WebApi_基于Token的身份验证——JWT
JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为: A.B.C A由JWT头部信息header加密得到B由JWT用到的身份验证信息json数据加密得到C由A和B加密得到,是校 ...
- Java调用.NET webservice方法的几种方式
最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...
- mac os 里的 JAVA_HOME
google了一下,发现了这篇文章Important Java Directories on Mac OS X(https://developer.apple.com/library/content/ ...
- LOJ 164 【清华集训2015】V——线段树维护历史最值
题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...