OpenCv学习篇——图像阈值化算法

opencv颜色识别-红色 前言 在进行opencv的颜色处理的时候,发现HSV通道进行阈值化的效果优于BGR通道,因此采用了HSV通道进行阈值划分,但是在识别红色时发现了一个问题,在opnecv中,HSV通道被划分为以下范围 H - (0-180) S - (0-255) V - (0-255) 在进行红色的识别时,发现怎么搞色块中都存在部分空缺,也就是无法识别的红色,如下图 于是上网查询了HSV的具体颜色划分,见下表 由此得知,在HSV通道中,红色的色调(H)存在着两个范围,因此使用单一的阈值化无法正确的将红色进行分离出来。 阅读详情

一.阈值化算法定义

所谓二值化简单一点讲,就是将图像划分成黑和白,通过设定一个标准如果大于这个标准就设为白,如果小于这个标准,就设为黑,而这个标准,就叫做阈值。

 

二.算法原理

1.RGB图像转灰度图像原理:RGB图像是有3个通道,也就是一个3维的矩阵,而灰度图,大家都知道只有一个通道,那么如何将一个3通道的事物转为1通道的事物呢?其实这其中是有一个转换公式的:

Gray = R*0.299 + G*0.587 + B*0.114

2.阈值化原理

三.代码中用到的OpenCv中的库函数详细解答(OpenCv2.49版本)


1>这些头文件包含二值化算法中的库函数

#include ‘’opencv2\highgui\highgui.hpp‘’
      #include ‘’opencv2\core\core.hpp‘’
      #include ‘’opencv2\imgproc\imgproc.hpp‘’
      #include ‘’opencv2/opencv.hpp‘’
     2>程序开头有这样
#include  #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

这句话是为了屏蔽控制台程序,每次运行都会出现一个类似dos似的黑框框为了美观,选择把它给屏蔽了,不屏蔽也不影响功能的使用。

3>加载一幅图像:IplImage *pSrcImage = cvLoadImage("lxy.jpg", CV_LOAD_IMAGE_UNCHANGED);

第一个参数是文件名,存在本工程中的文件夹即可

第二个参数:

cvLoadImage( filename, -1 ); 默认读取图像的原通道数也是本工程选取的参数
cvLoadImage( filename, 0 ); 强制转化读取图像为灰度图
cvLoadImage( filename, 1 ); 读取彩色图
4>转为灰度图像
g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
第一个参数:cvGetSize(pSrcImage)函数得到图像的尺寸,pSrcImage为加载之前原图的指针变量
第二个参数:
图像像素的位深度,值为可以为下面一种:
(
IPL_DEPTH_8U - 8位无符号整数
IPL_DEPTH_8S - 8位符号整数
IPL_DEPTH_16U - 16位无符号整数
IPL_DEPTH_16S - 16位符号整数
IPL_DEPTH_32S - 32位符号整数
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
)
第三个参数为通道数
//channel:通道数
RGB的时候是3
灰度图的时候1 因为要转灰度图所以在工程中这个参数用1
5> 是Opencv里的颜色空间转换函数,可以实现rgb颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。 原型: void cvCvtColor( const CvArr* src, CvArr* dst, int code );
入参:cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);
 src :输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
    dst :输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像。
code:色彩空间转换的模式,该code来实现不同类型的颜色空间转换。
比如:CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间。
其中当code选用CV_BGR2GRAY时,dst需要是单通道图片(cvcreateimage()最后一个参数是1的时候,就是代表单通道图)。
当code选用CV_BGR2HSV时,对于8位图,需要将rgb值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。
6>显示原图 
 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);窗口名字自动适应尺寸
 cvShowImage(pstrWindowsSrcTitle, pSrcImage);//指向原图的指针
7>cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);
第一个参数:滑动条的名称
第二个参数:窗口的名称,滑动条不会遮挡图像
第三个参数:当滑动条被拖到时,OpenCV会自动将当前位置所代表的值传给指针指向的整数
第四个参数:最大值
第五个参数:回调函数
解释一下回调函数:
什么是回调函数:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。(摘自知乎)

普通函数与回调函数的区别:

对普通函数的调用:
调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”

对回调函数调用:
调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

8>转为二值图像。

cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
//第一个参数表示输入图像,必须为单通道灰度图。
//第二个参数表示输出的边缘图像,为单通道黑白图。
//第三个参数表示阈值
//第四个参数表示最大值。
//第五个参数表示运算方法
 CV_THRESH_BINARY      =0, 

   CV_THRESH_BINARY_INV  =1, 

   CV_THRESH_TRUNC       =2, 

   CV_THRESH_TOZERO      =3, 

   CV_THRESH_TOZERO_INV  =4, 

   CV_THRESH_MASK        =7,

   CV_THRESH_OTSU        =8 

四.程序流程图

五.程序源码

#include ‘’opencv2\highgui\highgui.hpp‘’
#include ‘’opencv2\core\core.hpp‘’
#include ‘’opencv2\imgproc\imgproc.hpp‘’
#include ‘’opencv2/opencv.hpp‘’
using namespace std;

using namespace cv;

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  //屏蔽控制台程序

IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图(fzhykx1995)";

void on_trackbar(int pos)
{
// 转为二值图函数
cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
//第一个参数表示输入图像,必须为单通道灰度图。
//第二个参数表示输出的边缘图像,为单通道黑白图。
//第三个参数表示阈值
//第四个参数表示最大值。
//第五个参数表示运算方法

// 显示二值图 
cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);//第一个参数决定确定在哪个存在的窗口中显示图像,第二个参数是IplImage类型指针确定要显示的图像。
}

int main(int argc, char** argv)
{
const char *pstrWindowsSrcTitle = "原图(fzhykx1995)";
const char *pstrWindowsToolBarName = "二值图阈值";

// 从文件中加载原图 
IplImage *pSrcImage = cvLoadImage("lxy.jpg", CV_LOAD_IMAGE_UNCHANGED); //第一个参数是文件名,第二个参数是 

// 转为灰度图 
g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
//cvGetSize()函数得到图像大小
//depth
//图像像素的位深度,值为可以为下面一种:
//IPL_DEPTH_8U - 8位无符号整数
//IPL_DEPTH_8S - 8位符号整数
//IPL_DEPTH_16U - 16位无符号整数
//IPL_DEPTH_16S - 16位符号整数
//IPL_DEPTH_32S - 32位符号整数
//IPL_DEPTH_32F - 单精度浮点数
//IPL_DEPTH_64F - 双精度浮点数
//channel
//IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels);
//channel:通道数 RGB的时候是3 灰度图的时候1

cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);//CV_BGR2GRAY是RGB到gray。第一个参数的源图像第二个参数是目标图像

// 创建二值图 
g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

// 显示原图 
 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);//窗口名字自动适应尺寸
cvShowImage(pstrWindowsSrcTitle, pSrcImage);//指向原图
// 创建二值图窗口 
cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);

// 滑动条   
int nThreshold = 0;
cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);

on_trackbar(1);

cvWaitKey(0);

cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsBinaryTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&g_pGrayImage);
cvReleaseImage(&g_pBinaryImage);
 return 0;
}

六.测试效果图


OpenCvSharp学习笔记13--使用InRange进行HSV阈值过滤、渐变色生成 了解HSV色彩空间、掌握InRange函数、生成渐变色,通过HSV提取对象。 阅读详情

相关推荐

Opencv+颜色识别

一、安装opencv 链接:https://zhuanlan.zhihu.com/p/92184435 二、代码如下 import numpy as np import cv2 font = cv2.FONT_HERSHEY_SIMPLEX lower_green = np.array([35, 110, 106]) # 绿色范围低阈值 upper_green = np.array([77, 255, 255]) # 绿色范围高阈值 lower_red = np.array([0, 127, 128])

qq_53188955的博客 1865

[opencv]HSV常见颜色上下限值

这里以python版本opencv演示如何查找颜色 效果用鼠标确定确定待检测目标的HSV值 文章来源:https://www.jb51.net/article/206173.htm

FL1623863129的博客 2万+

OpenCV学习之路(十三) 图像阈值化

  官方文档   阈值可以被视为最简单的图像分割方法。比如从一幅图像中分割出我们所需要的物体部分(可以是一部分或整体)。该方法基于图像中物体与背景之间的灰度值差异,且此分割属于像素级的分割,用图像中的每一个像素点的灰度值和我们给定的阈值进行比较,并给出相应的判断(指定分割出物体的灰度值,如黑色或白色)。阈值的选取决于具体的问题。 OpenCV 2.X 中,使用 Threshold() 函数...

菜鸡程序猿的博客 2104

【opencv3】滑动条调节RGB颜色阈值并输出滑动条的值

实现目标: 首先对图像 RGB 色彩空间进行分割,然后根据分割出来的各个通道的图像进行二值化处理,通过滑动条可以调节二值化的阈值。如果想要从 xml 文件中读取预设阈值,并输出调节后的阈值到 xml 中,可以使用 FileStorage 类。...

霍喜猫的博客 2613

0013-图像的阈值化-OTSU、固定阈值法、基于局部的阈值化

在图像处理中,我们通常会把图像先进行简化处理。其中图像的灰度化和图像的阈值化是最常用的两种简化处理方法。图像的灰度化处理就是把图像从三维彩色空间降到一维的灰度空间,在OpenCV中实现起来很简单,用函数cvtColor就能实现。图像的阈值化处理是在灰度图像的基础上,把灰度图像进一步简化为二值图像,即整幅图像的各点像素值只用两个数值来表示,其中一个数值为零,另一个数值为非零值。图像的阈值化的关键是找...

清溪算法 3458

OpenCV C++ 二值图像处理:阈值化技术全解析

阈值化基础:理解threshold函数的 5 种操作类型,根据目标与背景的亮度关系选择合适类型;全局阈值:手动阈值适合简单场景,Otsu 和 Triangle 算法实现自动阈值选择,预处理能提升鲁棒性;自适应阈值:通过局部阈值解决光照不均问题,blockSize和C参数需根据图像特点调优;最佳实践:结合预处理(去噪、增强)和后处理(形态学操作),根据图像特性选择最合适的阈值化方法。

品质生活,极致编程。 1559

OpenCV阈值化处理

图像的阈值化就是利用图像像素点分布规律,设定阈值进行像素点分割,进而得到图像的二值图像。图像阈值化操作有多种方法,常用方法有经典的OTSU、固定阈值、自适应阈值、双阈值及半阈值化操作。这里对各种阈值化操作进行一个总结。 OTSU阈值化 在阈值化处理中,常用的算法就是OTSU。发明人是Nobuyuki Ostu。这种二值化操作阈值的选取非常重要,阈值选取的不合适,可能得到的结果就毫无用处。简...

konglongdanfo的博客 1万+

Opencv学习——图像阈值化

图像阈值化是最常用的图像处理方法,在很多领域应用广泛,机器视觉中产品的识别和定位中往往需要采用阈值处理使产品的特征更加明显,易于后续的处理。 本文主要介绍两种阈值处理方法即全局阈值化和局部阈值化。

Dangkie的专栏 971

【Opencv】阈值化

阈值化 文章目录阈值化1. 阈值化简介2. 固定阈值化2.1函数原型2.2 阈值化类型2.3程序举例3. 自适应阈值化3.1 用途3.2 实现原理3.3 函数原型3.4 用法举例4.otsus's阈值化4.1 otsus's阈值化简介 1. 阈值化简介 阈值化是一种图像分割的方法,用于从一幅图片里面提取我们需要的部分。比如分离图像的前景和背景。其基本原理就是利用一幅图像各个部分之间的像素差异,通过...

qq_41741344的博客 2376

[Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍。第二部分将讲解图像运算和图像增强,上一篇文章介绍图像灰度非线性变换,包括对数变换、幂次变换、指数变换、分段函数变换。这篇文章将详细讲解图像阈值化处理,涉及阈值化处理、固定阈值化处理和自适应阈值化处理,这是图像边缘检测或图像增强等处理的基础。希望文章对您有所帮助,如果有不足之处,还请海涵。

杨秀璋的专栏 6973

OpenCV开发笔记(三十):带你学习图像识别之经典OTSU算法阈值化

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 原博主博客导航:https://blog.youkuaiyun.com/qq21497936/article/details/102478062 本文章博客地址: 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 OpenCV开发笔记(三十):带你学习图像...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现

图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现

昊虹AI笔记 3747

【学习OpenCV4】阈值化总结

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下: 第1章 OpenCV快速入门; 第2章 图像读写模块imgcodecs; 第3章 核心库模块core; 第4章 图像处理模块imgproc(一); 第5章 图像处理模块imgproc(二); 第6章 可视化模块highgui; 第7章 视频处理模块videoio; 第8章 视频分析模块video; 第9章 照片处理模块photo; 第10章 2D特征模块features2d; 第11章 相机标定与三维重建模块calib

lxiao428的博客 1912

OpenCV之图像阈值化学习笔记

变体类型核心改进点适用场景OpenCV 原生支持关键优势基础 OTSU全局单阈值,最大化类间方差灰度分布双峰、光照均匀的图像是(THRESH_OTSU)简单、快速,无参数调优多阈值 OTSU分割多类别(k≥2)多灰度层级图像(如医学 CT)否(需第三方库)支持复杂场景的多目标分割加权 OTSU像素权重分配,偏向重要区域小目标、局部关键区域分割否(需自定义)提升关键区域的分割准确性自适应 OTSU局部子块独立计算阈值光照不均、局部背景差异大的图像否(需自定义)

xulibo5828的博客 1142

OpenCV开发笔记(二十九):带你学习图像识别之自适应阈值化

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 原博主博客导航:https://blog.youkuaiyun.com/qq21497936/article/details/102478062 本文章博客地址: 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 OpenCV开发笔记(二十九):带你学习图...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

OpenCV开发笔记(二十八):带你学习图像识别之阈值化

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 原博主博客导航:https://blog.youkuaiyun.com/qq21497936/article/details/102478062 本文章博客地址: 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 OpenCV开发笔记(二十八):带...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

python的图像阈值化处理及算法对比

(注:该部分参考作者的论文《基于苗族服饰的图像锐化和边缘提取技术研究》)图像的二值化或阈值化(Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群。灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如公式1所示:​当灰度Gray小于阈值T时,其像素设置为0,表示黑色;

s44359487yad的博客 1204

主动式桥梁防船撞预警系统的方案汇总

本系统以精密光电测高前端(2台,上下游各1台)、固态雷达(2台,上下游各1台)、AIS(1台)、偏航辅助前端(4台,上下游各2台)为核心,通过人工智能,对画面上的船舶目标进行深度学习、精确定位,再用系统集成方法将各设备有机结合在一起,构建成套的桥梁防撞主动预警系统,全天候监控过往船舶。主动式桥梁防船撞预警系统主要船舶监测采集单元、控制单元、船舶超高、偏航信息检测单元、以及视频监控单元组成,,通过声光警示、短信文字、船舶身份识别及海事对讲频道、视频录像取证等多种手段与船舶进行信息互动,主动防止船舶碰撞桥梁!

gdxixun的博客 973

Python图像处理(七)——图像阈值化处理

一、阈值化 图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。 当灰度Gray小于阈值T时,其像素设置为0,表示黑色;当灰度Gray大于或等于阈值T时,其Y值为255,表示白色。 Py..

AI_girl的博客 1万+

Windows10 使用Apple Studio Display显示器的设置

AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...

爱意随风起,人生不可弃。 1万+

一维光子晶体态密度计算与应用解析

态密度(DOS)是凝聚态物理和光子学中的核心概念,描述了量子态在能量空间的分布规律。基于麦克斯韦方程组的周期性介电结构分析表明,一维光子晶体通过布拉格散射形成光子带隙,其态密度曲线呈现典型的范霍夫奇点和禁带特征。这种特性使光子晶体在光学工程中具有重要价值,特别是在滤波器设计和传感器开发领域。通过转移矩阵法等数值计算手段,可以精确预测带隙位置和宽度,其中折射率对比度与周期数是关键设计参数。实际应用中,1550nm通信波段滤波器常采用Si/SiO2交替结构,而引入缺陷层则能产生高Q值缺陷模。计算优化时需注意数值

weixin_36487018的博客 193
下一篇: OpenCv学习篇——图像中值滤波算法
fzhykx
博客等级 码龄9年 458粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值