《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处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...
随机推荐
- EasyTouch中多种QuickGesture手势检测
EasyTouch中QuickGesture的用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Qu ...
- HDU 1232:畅通工程(并查集模板)
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【java编程】正确重写hashCode和equesl方案
一. 正确书写hashCode的办法: [原则]按照equals( )中比较两个对象是否一致的条件用到的属性来重写hashCode(). {1}. 常用的办法就是利用涉及到的的属性进行线性组合. {2 ...
- zeroMQ 学习
zeroMQ 是一个高性能的分布式设计的消息队列,网上有人进行过性能的比较,非常厉害,并且很大约40多种语言的API 可以调用,真实很不错的. 而且有一点就是使用简单,不需要服务器,对于使用C/C++ ...
- 用zcat查看压缩日志中百度抓取的量
比如查看124.251.44.85这一台服务器的07-13,07-14,07-15的日志中百度抓取http://www.baidu.com/search/spider.html 的量 wc命令参考博客 ...
- js模板引擎之juicer,特别好用
中文文档地址 https://www.npmjs.com/package/juicer Juicer基础知识:语法2 http://blog.163.com/lvshutao@126/blog/st ...
- 升级CentOS 7.4内核版本的三种方案
https://blog.csdn.net/breeze915/article/details/79243673 在实验环境下,已安装了最新的CentOS 7.4操作系统,现在需要升级内核版本. 实验 ...
- 消息中间件 ActiveMQ的简单使用
一.AactiveMQ的下载和安装 1. 下载ActiveMQ 地址:http://activemq.apache.org/activemq-5152-release.html 我这里下载的是wind ...
- Vue 介绍
1. 条件 效果图. 如果seen为false,文字将消失 2. 循环 script里定义数据 效果 3. 事件处理 效果如下图, hello world被逆转了
- 简单的爬虫例子——爬取豆瓣Top250的电影的排名、名字、评分、评论数
爬取思路: url从网页上把代码搞下来bytes decode ---> utf-8 网页内容就是我的待匹配的字符串ret = re.findall(正则,待匹配的字符串), ret 是所有匹配 ...