阈值操作类型

这5种阈值操作类型保留opencv tutorials中的英文名称。依次为:

  1. Threshold Binary:即二值化,将大于阈值的灰度值设为最大灰度值。小于阈值的值设为0。

  2. Threshold Binary, Inverted:将大于阈值的灰度值设为0。大于阈值的值设为最大灰度值。
  3. Truncate:将大于阈值的灰度值设为阈值。小于阈值的值保持不变。

  4. Threshold to Zero:将小于阈值的灰度值设为0,大于阈值的值保持不变。
  5. 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;
}
}
}
  1. 整个程序就一句话是关键:

    threshold(gray, dst, th_val, max_BINARY_val, th_type);

    threshold的參数依次是原灰度图、输出阈值操作后的图、阈值、最大灰度值以及阈值类型。当中,最大灰度值并不一定就是255,在上面提到的阈值操作1和2中提到,“设为最大灰度值”,假设你认为不像让图像的最大灰度值大于200,那就设为200就好了。阈值类型取值为0~4。按顺序依次相应前面提到的5种阈值操作类型。

  2. createTrackbar是创建滑动条的gui函数。

    createTrackbar("Value", wn, &th_val, max_val, Thresh);为例,该滑动条值与变量th_val的值关联,一旦th_val改变,自己主动调用回调函数Thresh,createTrackbar使用的回调函数格式必需是程序中的void Thresh(int, void *),即返回void,參数含intvoid *类型。

效果

 

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

 

这回是未知美女一枚,使用阈值操作方法3后的结果如右图,感觉没什么区别,有木有?确实区别不大,谁叫人家头发本来就那么黑那么靓丽呢!

细看还是能看出来眉毛变细了,发丝变黑了。

OpenCV图像处理篇之阈值操作函数的更多相关文章

  1. OpenCV图像处理篇之边缘检测算子

    OpenCV图像处理篇之边缘检测算子 转载: http://xiahouzuoxin.github.io/notes/ 3种边缘检测算子 一阶导数的梯度算子 高斯拉普拉斯算子 Canny算子 Open ...

  2. OpenCV图像处理篇之边缘检測算子

    3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...

  3. OpenCV图像处理篇之腐蚀与膨胀

    转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最主要的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算. ...

  4. Redis系列-存储篇string主要操作函数小结

    通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简单且常用的string开始. 1.新增 a)se ...

  5. OpenCV图像处理篇之图像平滑

    图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器.为不改变图像的相位信息,一般使用线性滤波器,其统一形式例如以下: %20\Large%20g(i,j)=\sum_{k ...

  6. OpenCV基础篇之像素操作对照度调节

    程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  7. openCV 矩阵(图像)操作函数

    有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等.大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分 少部分函 ...

  8. Redis系列-存储篇set主要操作函数小结

    最近,总是以“太忙“为借口,很久没有blog了,凡事贵在恒,希望我能够坚持不懈,毕竟在blog的时候,也能提升自己.废话不说了,直奔主题”set“ redis set 是string类型对象的无序集合 ...

  9. Redis系列-存储篇hash主要操作函数小结

    阳光透过玻璃,洒在身上,一杯暖茶在手,说不尽的安逸自得,让我有种想再写篇blog的冲动.上篇主要谈了string,这里谈谈hash吧!hash是一些列key value(field value)的映射 ...

随机推荐

  1. X-010 FriendlyARM tiny4412 uboot移植之移植网卡驱动TFTP用起来

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  2. 关于Vue的一些小技巧

    前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...

  3. A* search算法解迷宫

    这是一个使用A* search算法解迷宫的问题,细节请看:http://www.laurentluce.com/posts/solving-mazes-using-python-simple-recu ...

  4. 邮件基本常识普及(to/cc/bcc)

    http://blog.sina.com.cn/s/blog_5572b4b5010009ul.html 前两天,某个同事发的一封邮件着实把我给郁闷了,他发的是图片形式的笑话,内容稍稍有点不太健康,这 ...

  5. C#引用类型转换,到底使用is,as还是显式强转?

    在C#中,当引用类型需要转换的时候,经常会用到关键字is.as以及显式强转.本篇来体验这三者的用法. 先来梳理.NET引用类型转换的"约定俗成",或者叫"惯例" ...

  6. java多线程实现主线程等待子线程执行完问题

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  7. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  8. 基于svnserve的SVN服务器(windows下安装与配置)

    基于svnserve的SVN服务器(windows下安装与配置) 基于svnserve的SVN服务器(windows下安装与配置)关键字: svn 安装SVNserve 从http://subvers ...

  9. 追MM和Java的23种设计模式

    我在Java论坛看到这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的启发作用,但可惜没有给出具体的意思,我就在后边加上了.这些都是最简单的介绍,要学习的话建议你看一下阎宏博士的<J ...

  10. Top N的MapReduce程序MapReduce for Top N items

    In this post we'll see how to count the top-n items of a dataset; we'll again use the flatland book ...