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)的映射 ...
随机推荐
- Linux系统不可不知的命令:sudo
转自:http://www.embeddedlinux.org.cn/html/xinshourumen/201308/05-2608.html sudo是个统管一切的命令.它的字面意思是代表“超级用 ...
- C#位运算符的基本用法
位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等. ...
- datagrid在MVC中的运用04-同时添加搜索和操作区域
本文介绍在datagrid上同时添加搜索和操作区域. 仅仅是增加操作区域 □ 方法1 $('#dg').datagrid({ toolbar: '#tb' }); <div id="t ...
- java基础之hashcode理解及hashmap实现原理及MD5
HashCode值 1. hashcode值是int的,64位.int hashCode(). 2. java object类默认的hashcode()计算方法是根据对象的内存地址来计算的.所以可由此 ...
- 转 UIActivityIndicatorView、UIProgressView 活动与进度指示器-IOS开发
活动指示器(UIActivityIndicatorView)可以告知用户有一个操作正在进行中.进度指示器(UIProgressView )也具有同样功能,而且还可以告知用户离操作结束还多远. 这两个指 ...
- easyui input设置为disabled提交后获取不到属性值
在做网站管理后台的用户修改功能时,由于当前用户修改个人信息时规定用户名不能修改,故使用了input标签的disabled属性,但是在提交数据后却发现用户名显示为空了.后 来一查才知道input设置为d ...
- Java – Top 5 Exception Handling Coding Practices to Avoid
This article represents top 5 coding practices related with Java exception handling that you may wan ...
- spring中ApplicationContextAware接口使用理解
一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...
- iOS:UIImageView图像视图控件
UIImageView:图像视图控件: 它是UIView的子类,因此也是视图控件,可以用来显示图像.因为它具有帧动画属性和操作方法,因此可以用来制作动画,其实动画就是很短的时间内,执行显示连续的 ...
- 基于zabbix 的memached 多实例监控
基于zabbix 的memached 多实例监控 zabbix agentd 配置文件新增配置: UserParameter=memcached.server.discovery[*],ps uax ...