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)的映射 ...
随机推荐
- Hyper-V创建固定大小虚拟机
1.新建硬盘 点击确定,就创建好了一个固定大小的vhd文件,下面我们开始创建虚拟机. 2.创建虚拟机 输入虚拟机名称 选择第一代虚拟机 我这里给虚拟机分配512MB内存 网络配置 在这之前我们已经创建 ...
- C#多线程编程之:lock使用注意事项
1.避免锁定public类型对象. 如果实例可以被公共访问,将出现lock(this)问题. 如有一个类MyClass,该类有一个Method方法通过lock(this)来实现互斥: 1 public ...
- debuginfo-install glibc-2.17-157.el7.x86_64
Running transaction Installing : glibc-debuginfo-common-.el7.x86_64 / Installing : glibc-debuginfo-. ...
- MVC文件上传05-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义上传文件夹
在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 MVC文 ...
- Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败 ...
- AFNetworking 2.0使用(持续更新)
本人视频教程系列 导入AFNetworking 2.0 文件夹,引入头文件AFNetworking.h --------------- *使用NSURLSessionDownloadTask来下载一张 ...
- MATLAB SVM
clc;clear;close all; traindata = [1,0; 3,10; 2,2; 2,3; -1,-1; -6,-4; -4,-1; -1.5, -3];group = [1 1 1 ...
- Wordpress中文章的特色图像Featured Image究竟存在哪里?
最近项目需要,分析了一下Wordpress的特色图像 Feature Image的上传.保存方式,这一分析觉得Wordpress的数据结构设计还真是有想法. 先简单说一下结论: Wordpress中图 ...
- MVC 部署在IIS7 出现的 404 错误
如果你不幸在 windows server 2008 R2 的 IIS7 中部署 MVC 站点的话,如果你输入:http://yourdomain/Organization/Index ,那么你很有可 ...
- 【BZOJ】【3670】【NOI2014】动物园
KMP算法 其实就像题面描述的那样……主要还是KMP算法的基础上搞一些DP(递推)之类…… 随便yy一下就可以得到50分了,因为num数组跟next的关系还是很密切的…… f[i]=f[next[i] ...