OpenCV图像处理篇之阈值操作函数
阈值操作类型
这5种阈值操作类型保留opencv tutorials中的英文名称。依次为:
- Threshold Binary:即二值化,将大于阈值的灰度值设为最大灰度值。小于阈值的值设为0。
- Threshold Binary, Inverted:将大于阈值的灰度值设为0。大于阈值的值设为最大灰度值。
- Truncate:将大于阈值的灰度值设为阈值。小于阈值的值保持不变。
- Threshold to Zero:将小于阈值的灰度值设为0,大于阈值的值保持不变。
- Threshold to Zero, Inverted:将大于阈值的灰度值设为0,小于阈值的值保持不变。
OpenCV提供了threshold函数专门用于阈值操作,事实上实现起来非常easy,为什么非得调用函数呢?一是熟悉了调用函数非常方便,假设一行代码能搞定的事为什么非得用几个循环呢?二是对于新手,自己实现未必敢保证执行效率上未必能达到opencv那样好。
程序分析
/*
* FileName : filter_and_threshold.cpp
* Author : xiahouzuoxin @163.com
* Version : v1.0
* Date : Sat 20 Sep 2014 07:04:29 PM CST
* Brief :
*
* Copyright (C) MICL,USTB
*/
#include "cv.h"
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
Mat src,gray,dst;
const char *wn = "Demo";
int th_val = 0;
int th_type = 3;
int const max_val = 255;
int const max_type = 4;
int const max_BINARY_val = 255;
static void Thresh(int, void *)
{
/*
* 0: Binary
* 1: Binary Inverted
* 2: Threshold Truncated
* 3: Threshold to Zero
* 4: Threshold to Zero Inverted
*/
threshold(gray, dst, th_val, max_BINARY_val, th_type);
imshow(wn, dst);
}
/*
* @brief
* @inputs
* @outputs
* @retval
*/
int main(int argc, char *argv[])
{
if (argc < 2) {
cout<<"Usage: ./threshold [file name]"<<endl;
return -1;
}
// read image as GRAYSCALE
src = imread(argv[1], CV_LOAD_IMAGE_COLOR);
if (!src.data) {
cout<<"Error: read data"<<endl;
return -1;
}
// window to display
namedWindow(wn);
createTrackbar("Value", wn, &th_val, max_val, Thresh); /* bar */
createTrackbar("Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted",
wn, &th_type, max_type, Thresh);
cvtColor(src, gray, CV_RGB2GRAY);
// Init by Calling Thresh
Thresh(0, 0);
// wait if ESC be pressed
while(1)
{
char c = waitKey(20);
if(c == 27) /* ESC */
{
break;
}
}
}
整个程序就一句话是关键:
threshold(gray, dst, th_val, max_BINARY_val, th_type);threshold的參数依次是原灰度图、输出阈值操作后的图、阈值、最大灰度值以及阈值类型。当中,最大灰度值并不一定就是255,在上面提到的阈值操作1和2中提到,“设为最大灰度值”,假设你认为不像让图像的最大灰度值大于200,那就设为200就好了。阈值类型取值为0~4。按顺序依次相应前面提到的5种阈值操作类型。
createTrackbar是创建滑动条的gui函数。以
createTrackbar("Value", wn, &th_val, max_val, Thresh);为例,该滑动条值与变量th_val的值关联,一旦th_val改变,自己主动调用回调函数Thresh,createTrackbar使用的回调函数格式必需是程序中的void Thresh(int, void *),即返回void,參数含int和void *类型。
效果

林依晨的的图片被我P一下就成那样了!上面的第二幅图片使用的是阈值操作2。

这回是未知美女一枚,使用阈值操作方法3后的结果如右图,感觉没什么区别,有木有?确实区别不大,谁叫人家头发本来就那么黑那么靓丽呢!
细看还是能看出来眉毛变细了,发丝变黑了。
OpenCV图像处理篇之阈值操作函数的更多相关文章
- OpenCV图像处理篇之边缘检测算子
OpenCV图像处理篇之边缘检测算子 转载: http://xiahouzuoxin.github.io/notes/ 3种边缘检测算子 一阶导数的梯度算子 高斯拉普拉斯算子 Canny算子 Open ...
- OpenCV图像处理篇之边缘检測算子
3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...
- OpenCV图像处理篇之腐蚀与膨胀
转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最主要的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算. ...
- Redis系列-存储篇string主要操作函数小结
通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简单且常用的string开始. 1.新增 a)se ...
- OpenCV图像处理篇之图像平滑
图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器.为不改变图像的相位信息,一般使用线性滤波器,其统一形式例如以下: %20\Large%20g(i,j)=\sum_{k ...
- OpenCV基础篇之像素操作对照度调节
程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...
- openCV 矩阵(图像)操作函数
有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等.大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分 少部分函 ...
- Redis系列-存储篇set主要操作函数小结
最近,总是以“太忙“为借口,很久没有blog了,凡事贵在恒,希望我能够坚持不懈,毕竟在blog的时候,也能提升自己.废话不说了,直奔主题”set“ redis set 是string类型对象的无序集合 ...
- Redis系列-存储篇hash主要操作函数小结
阳光透过玻璃,洒在身上,一杯暖茶在手,说不尽的安逸自得,让我有种想再写篇blog的冲动.上篇主要谈了string,这里谈谈hash吧!hash是一些列key value(field value)的映射 ...
随机推荐
- ASP.NET与MVC架构区别总结
1)ASP.NET Webforms Behind Code利于快速开发,方便可视化操作. 2)ASP.NET 使用了“基于视图”的解决方案去应对“基于行为”的需求,它处理了客户端的请求,IIS将请求 ...
- 数据表-java类的映射
1.一个数据表对应一个java类 2.数据表的字段对应java类的属性 3.一对多的数据表关系 一方用一个java对象表示 多方用一个java对象数组表示 4.多对多的数据表关系:采用中间表,将多对多 ...
- Digital Adjustment of DC-DC Converter Output Voltage in Portable Applications
http://pdfserv.maximintegrated.com/en/an/AN818.pdf http://www.maximintegrated.com/app-notes/index.mv ...
- php 利用fsockopen GET/POST 提交表单及上传文件
1.GET get.php <?php $host = 'demo.fdipzone.com'; $port = 80; $errno = ''; $errstr = ''; $timeout ...
- clip-path 教程:使用 CSS 中的 clip-path 轻松实现多边形
作为一个前端开发,一个主要的工作就是来实现设计师设计的UI界面.而在UI界面中,各种各样的形状元素应用则是随处可见,比如三角形: 以前碰到这种形状的时候,会使用各种黑科技的技巧,比如使用CSS中的bo ...
- SonarQube使用
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 一.安装 1.下载好sonarqube后,解压打开bin目录,启 ...
- Android中高亮变色显示文本中的关键字
应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...
- Tomcat集群扩展session集中管理,Memcached-session-manager使用
研究tomcat做负载均衡的时候如何实现ha,还有就是不采用session复制的方法做集群. 想到的是将session全部存储在后端的缓存服务器中. 正好网上有这么一个工具Memcached-sess ...
- UEFI+GPT引导基础篇 :什么是GPT,什么是UEFI?
GUID Partition Table (GPT) is a standard for the layout of the partition table on a physical storage ...
- 特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;
字符集.字符序的概念与联系 在数据的存储上,MySQL提供了不同的字符集支持.而在数据的对比操作上,则提供了不同的字符序支持. MySQL提供了不同级别的设置,包括server级.database级. ...