OpenCV 基本阈值操作
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 基本阈值操作相关的知识,希望对你有一定的参考价值。
文章目录
图像阈值
阈值是什么?
简单点说是把图像分割的标尺
例如:从一副图像中利用阈值分割出我们需要的物体部分。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。
为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。
一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。
具体示例如:在PS中的阈值,实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑(可以跟滤镜中的其它――高反差保留,再用阈值效果会更好)。
阈值类型
(解释说明:以下五种类型,左图皆为转化前像素值柱形图,中间为转化公式,右图为转化后像素值柱形图)
阈值二值化(threshold binary)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
解释:在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。
阈值反二值化(threshold binary Inverted)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
解释:该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。
截断 (truncate)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
解释:同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。
阈值取零 (threshold to zero)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
解释:先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。
阈值反取零 (threshold to zero inverted)
左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值
解释:原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。
API:threshold函数
OpenCV中的阈值(threshold)函数:
函数原型:
threshold(img, threshold, maxval,type)
参数说明:
threshold
:是设定的阈值maxval
:是当灰度值大于(或小于)阈值时将该灰度值赋成的值type
:规定的是当前二值化的方式
代码演示
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace cv;
using namespace std;
/// 全局变量定义及赋值
int threshold_value = 160;
int threshold_type = 3;;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;
Mat src, src_gray, dst;
char* window_name = "Threshold Demo";
char* trackbar_type = "Type";
char* trackbar_value = "Value";
/// 自定义函数声明
void Threshold_Demo(int, void*);
int main(int argc, char** argv)
/// 读取一副图片,不改变图片本身的颜色类型(该读取方式为DOS运行模式)
src = imread("./test1.jpg");
/// 将图片转换成灰度图片
cvtColor(src, src_gray, CV_RGB2GRAY);
/// 创建一个窗口显示图片
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
/// 创建滑动条来控制阈值
createTrackbar(trackbar_type,
window_name, &threshold_type,
max_type, Threshold_Demo);
createTrackbar(trackbar_value,
window_name, &threshold_value,
max_value, Threshold_Demo);
/// 初始化自定义的阈值函数
Threshold_Demo(0, 0);
/// 等待用户按键。如果是ESC健则退出等待过程。
while (true)
int c;
c = waitKey(20);
if ((char)c == 27)
break;
// 自定义的阈值函数
void Threshold_Demo(int, void*)
/* 0: 二进制阈值
1: 反二进制阈值
2: 截断阈值
3: 0阈值
4: 反0阈值
*/
threshold(src_gray, dst, threshold_value, max_BINARY_value, threshold_type);
imshow(window_name, dst);
以上是关于OpenCV 基本阈值操作的主要内容,如果未能解决你的问题,请参考以下文章