Opencv step by step - 阈值化
Opencv里面的阈值化做起来比较简单,只需要一个函数即可:
/* Applies fixed-level threshold to grayscale image.
This is a basic operation applied before retrieving contours */
CVAPI(double) cvThreshold( const CvArr* src, CvArr* dst,
double threshold, double max_value,
int threshold_type );
这里是根据threadshould来决定处理源图像的阈值,使用threshold_type 来决定如何处理。
这里有5种选择,详见:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/threshold/threshold.html
下面来实践一下:
#include <cv.h>
#include <highgui.h>
#include <stdio.h> /* CV_IMPL void
cvAddWeighted( const CvArr* srcarr1, double alpha,
const CvArr* srcarr2, double beta,
double gamma, CvArr* dstarr )
{
cv::Mat src1 = cv::cvarrToMat(srcarr1), src2 = cv::cvarrToMat(srcarr2),
dst = cv::cvarrToMat(dstarr);
CV_Assert( src1.size == dst.size && src1.channels() == dst.channels() );
cv::addWeighted( src1, alpha, src2, beta, gamma, dst, dst.type() );
} void cv::addWeighted( InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype )
{
double scalars[] = {alpha, beta, gamma};
arithm_op(src1, src2, dst, noArray(), dtype, getAddWeightedTab(), true, scalars);
} */ void sum_rgb(IplImage* src, IplImage *dst, int type)
{
IplImage *r = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage *g = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage *b = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); //split the image to three color planes
cvSplit(src, r, g, b, NULL); IplImage *s = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); /*
void cvAddWeighted(const CvArr* src1, double alpha,
const CvArr* src2, double beta, double gamma, CvArr* dst)
dst = src1 * alpha + src2 * beta + gamma
*/
cvAddWeighted(r, 1.0/3.0, g, 1.0/3.0, 0.0, s);
cvAddWeighted(s, 1.0/1.0, b, 1.0/3.0, 0.0, s); cvThreshold(s, dst, 100, 255, type);
cvReleaseImage(&r);
cvReleaseImage(&g);
cvReleaseImage(&b);
cvReleaseImage(&s); } int main(int argc, char **argv)
{
cvNamedWindow("HI", 1);
IplImage *src = cvLoadImage(argv[1]);
IplImage *dst = cvCreateImage(cvGetSize(src), src->depth, 1); const int methods[5] = {CV_THRESH_BINARY, CV_THRESH_BINARY_INV,
CV_THRESH_TRUNC, CV_THRESH_TOZERO_INV,
CV_THRESH_TOZERO};
const char* methods_str[5] = {"CV_THRESH_BINARY", "CV_THRESH_BINARY_INV",
"CV_THRESH_TRUNC", "CV_THRESH_TOZERO_INV",
"CV_THRESH_TOZERO"}; for(int i = 0; i < 5; i++) {
sum_rgb(src, dst, methods[i]);
cvShowImage(methods_str[i], dst);
} while(1) { if(cvWaitKey(10) & 0x7f == 27)
break; } cvDestroyWindow("HI");
cvReleaseImage(&src);
cvReleaseImage(&dst); }
这里的关键函数是:
cvThreshold(s, dst, 100, 255, type);
效果如下:
Opencv step by step - 阈值化的更多相关文章
- OpenCV阈值化处理
图像的阈值化就是利用图像像素点分布规律,设定阈值进行像素点分割,进而得到图像的二值图像.图像阈值化操作有多种方法,常用方法有经典的OTSU.固定阈值.自适应阈值.双阈值及半阈值化操作.这里对各种阈值化 ...
- Opencv step by step - 自适应阈值
上个博客提到的阈值化只是针对图像全局进行阈值化,opencv提供了一个更好的函数cvAdaptiveThreshold,可以做到局部特征的阈值化,这样一来, 整个图像的信息可以被更好的提取. #inc ...
- 【学习opencv第七篇】图像的阈值化
图像阈值化的基本思想是,给定一个数组和一个阈值,然后根据数组中每个元素是低于还是高于阈值而进行一些处理. cvThreshold()函数如下: double cvThreshold( CvArr* s ...
- opencv学习之路(13)、图像阈值化threshold
一.图像阈值化简介 二.固定阈值 三.自适应阈值 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src ...
- opencv python 图像二值化/简单阈值化/大津阈值法
pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...
- opencv之图像阈值化处理
一.函数简介 1.threshold-图像简单阈值化处理 函数原型:threshold(src, thresh, maxval, type, dst=None) src:图像矩阵 thresh:阈值 ...
- OpenCV3编程入门笔记(4)腐蚀、膨胀、开闭运算、漫水填充、金字塔、阈值化、霍夫变换
腐蚀erode.膨胀dilate 腐蚀和膨胀是针对图像中的白色部分(高亮部分)而言的,不是黑色的.除了输入输出图像外,还需传入模板算子element,opencv中有三种可以选择:矩形MORPH_RE ...
- WPF Step By Step 自定义模板
WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (二) 图片验证码的识别
上一篇文章讲了“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 一 京东 商品搜索 ...
- 灰度图像阈值化分割常见方法总结及VC实现
转载地址:http://blog.csdn.net/likezhaobin/article/details/6915755 在图像处理领域,二值图像运算量小,并且能够体现图像的关键特征,因此被广泛使用 ...
随机推荐
- python 读写、创建 文件
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...
- iperf测试
在服务端运行iperf,输入命令iperf –s –p 12345 –i 1 –M 以在本机端口12345上启用iperf 在客户端运行iperf,输入命令iperf –c server-ip –p ...
- 通过XmlSerializer 实现XML的序列化与反序列化
通过XmlSerializer 我们可以十分简单的将Model与XML进行转换 官文在点这里 帮助类 using System; using System.Text; using System.Xml ...
- 使用MiniProfiler调试ASP.NET MVC网站性能
MiniProfiler 以前开发Webform的时候可以开启trace来跟踪页面事件,这对于诊断程序的性能是有很大的帮助的,起到事半功倍的作用,今天我就来谈用mvc开 发项目的调试和性能监控.EF框 ...
- jquery实践案例--验证电子邮箱
<input type="email" name="email" id="email" value="" onpa ...
- 烂泥: KVM虚拟机Linux系统增加硬盘
本文由秀依林枫提供友情赞助,首发于烂泥行天下. Linux虚拟机在使用过程中,硬盘空间不够使用.由于前期没有做LVM,所以只能手动添加新的硬盘. 给虚拟机添加硬盘有两种方法: 1.通过virsh at ...
- D_S 线性结构
线性结构的定义:若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继. 线性结构的特点: 只有一个首结点和尾结点 除首尾结点外,其他结点只有一个直 ...
- Regarding learning
when you learn something, just like learn computer language. if you just learn some basic usage, not ...
- Neo4j 高可用集群安装
安装neo4j高可用集群,抓图安装过程 http://www.ibm.com/developerworks/cn/java/j-lo-neo4j/ Step1.下载neo4j商业版并解压,复制为neo ...
- [转]Oracle分页之二:自定义web分页控件的封装
本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html 上节中,讲述的就是Oracle存储过程分页的使用方式,但是如 ...