OpenCV图像处理篇之阈值操作函数

阈值操作类型

这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函数专门用于阈值操作,其实实现起来很简单,为什么非得调用函数呢?一是熟悉了调用函数很方便,如果一行代码能搞定的事为什么非得用几个循环呢?二是对于新手,自己实现未必敢保证运行效率上未必能达到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后的结果如右图,感觉没什么差别,有木有?确实差别不大,谁叫人家头发本来就那么黑那么靓丽呢!细看还是能看出来眉毛变细了,发丝变黑了。

时间: 2024-10-22 00:09:29

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

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

转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最基本的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算.腐蚀和膨胀的应用非常广泛,而且效果还很好: 腐蚀可以分割(isolate)独立的图像元素,膨胀用于连接(join)相邻的元素,这也是腐蚀和膨胀后图像最直观的展现 去噪:通过低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点 图像轮廓提取:腐蚀操作 图像分割 等等...(在文后给出一则简单实用膨胀操作提

OpenCV图像处理篇之Hough变换

图像空间到参数空间的转换 对于图像中共线的点集{(x0,y0), (x1,y1), ...}都经过直线y=kx+b,先在我们换一个说法,"斜率为k,截距为b的直线y=kx+b包含了所有在该直线上的点".一种强调的是图像中的点集,另一种强调的是直线的参数k和b,通过直线的点集去描述这条直线明显没有直接通过k,b两个参数去描述那样直接方便.而Hough变换就是将我们"点共线"的思维转化到参数空间{k,b}进行描述,图像空间中所有经过y=kx+b的点经过Hough变换后在

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

3种边缘检测算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性,沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于二维的图像,梯度定义为一个向量, Gx对于x方向的梯度,Gy对应y方向的梯度,向量的幅值本来是 mag(f)?=?(Gx2?+?Gy2)1/2,为简化计算,一般用mag(f)=|Gx|+|Gy|近似,幅值同时包含了x而后y方向的梯度信息.梯度的方向为 α?=?arctan(Gx/Gy) . 由于图像

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

3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于二维的图像.梯度定义为一个向量. Gx对于x方向的梯度,Gy相应y方向的梯度,向量的幅值本来是 mag(f)?=?(Gx2?+?Gy2)1/2,为简化计算,一般用mag(f)=|Gx|+|Gy|近似,幅值同一时候包括了x而后y方向的梯度信息.梯度的方向为 α?=?arctan(Gx/Gy) . 因为

OpenCV图像处理篇之图像平滑

图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器,其统一形式如下: 其中h称为滤波器的核函数,说白了就是权值.不同的核函数代表不同的滤波器,有不同的用途. 在图像处理中,常见的滤波器包括: 归一化滤波器(Homogeneous blur) 也是均值滤波器,用输出像素点核窗口内的像素均值代替输出点像素值. 高斯滤波器(Guassian blur) 是实际中最常用的滤波器,高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积

OpenCV图像处理篇之采样金字塔

转载请注明出处:http://xiahouzuoxin.github.io/notes 图像金字塔 图像金字塔是通过将原始图像经过平滑.下采样所生成一系列具有不同分辨率的图像的集合.金字塔结构(Pyramid)适于多分辨率处理的一种图像存储数据结构. 最常用的生成图像金字塔的方法是采用高斯函数平滑图像,每次将分辨率降低为原来的一半,由此得到一个图像序列{ML,ML-1,--,M0},图像金字塔的存储量为N^2*(1+1/4+1/16+...)=(4*N^2)/3. 如上图:最右边为原始图像,从右

Python+OpenCV图像处理之开闭操作

开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素 作用:用来消除小物体.平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线 闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素 作用:用来填充物体内细小空洞.连接邻近物体.平滑其边界的同时并不明显改变其面积 python实现 im

Redis系列-存储篇list主要操作函数小结(转)

在总结list之前,先要弄明白几个跟list相关的概念: 列表:一个从左到右的队列,个人理解更类似于一个栈,常规模式下,先进列表的元素,后出. 表头元素:列表最左端第一个元素. 表尾元素:列表最右端的最后一个元素.不包含任何元素的列表成为空列表. 1)新增 a)lpush 语法:lpush key value[value] 解释:把一个或多个元素插入表头.如果是多个value时,按照从左到右的次序插.返回插入元素的个数 [plain] view plaincopy [[email protect

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

hash是一些列key value(field value)的映射表.常常用其存储一些对象实例.相对于把一个对象的各个字段存储为string,存储为hash会占用更少的内存.为什么会更省内存呢?需要搞清楚两个配置(hash-max-zipmap-entries和hash-max-zipmap-value)的含义,配置的详细介绍,我打算放在最后的配置优化环节讲. 1)新增 a)hset 语法:hset key field value 解释:设置hash表key中的field的值.如果hash表不存