图像预处理-色彩空间补充,灰度化与二值化

一.图像色彩空间转换

1.1 HSV颜色空间

HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色

一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

H: 0— 180

S: 0— 255

V: 0— 255

也就是可以通过颜色的范围来提取图像中的一种或多种颜色。

HSV的好处

- 符合人类对颜色的感知方式:人类对颜色的感知是基于色调、饱和度亮度三个维度的,而HSV颜色空间恰好就是通过这三个维度来描述颜色的。因此,使用HSV空间处理图像可以更直观地调整颜色和进行色彩平衡等操作,更符合人类的感知习惯。

- 颜色调整更加直观:例如,在RGB空间中要调整红色系的颜色,需要同时调整R、G、B三个通道的数值,而在HSV空间中只需要调整色调饱和度即可。

- 降维处理有利于计算:在图像处理中,降维处理可以减少计算的复杂性和计算量。HSV颜色空间相对于RGB颜色空间,减少了两个维度(红、绿、蓝)

1.2 颜色空间转换

cv2.cvtColor(img,code)

code:指定转换的类型,可以使用预定义的转换代码。

- cv2.COLOR_RGB2GRAY 表示从RGB到灰度图像的转换

- cv2.COLOR_BGR2HSV 从RGB到HSV的转换

二.灰度化

彩色图是由R、G、B三个通道组成,而灰度图只有一个通道。

灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色但是,灰度图像的取值可以是0~255,不过只有一个通道。这样可以有256级灰度

# 在读取时也可以直接将其转化为灰度图
import cv2 as cvimg = cv.imread('../images/flower.png', cv.IMREAD_GRAYSCALE)
cv.imshow('Gray Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

2.1 最大值法

从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值.

2.2 平均值法

将R、G、B三个通道的像素值全部加起来,然后再除以三。

2.3 加权均值法(最常用且内置)

        按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。权重的比例为: R乘以0.299G乘以0.587B乘以0.114,这是经过大量实验得到的一个权重比例,也是一个比较常用的权重比例

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)cv.imshow('Original', flower)
cv.imshow('Gray', gray) cv.waitKey(0)   
cv.destroyAllWindows()

三. 二值化处理

二值图像的二维矩阵仅由两个值构成,也就是灰度图像的取值范围变了,只有0,1

- 其操作的图像必须灰度图

二值化处理函数

_,binary = cv2.threshold(img,thresh,maxval,type)

- img:输入图像,要进行二值化处理的灰度图

- thresh:设定的阈值。

- maxval:当像素值大于(或小于,取决于阈值类型)thresh时,该像素被赋予的值。

- type:阈值处理的类型。

- 返回值

  - 第一个值(通常用下划线表示):计算出的阈值,若使用自适应阈值法,会根据算法自动计算出这个值。

  - 第二个值(binary):二值化后的图像矩阵。与输入图像尺寸相同。

3.1 阈值法

THRESH_BINARY

        设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval(通常为255)

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用阈值法二值化
_,binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

3.2 反阈值法

THRESH_BINARY_INV

与阈值法相反

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用反阈值法二值化
_,binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

3.3 截断阈值法

THRESH_TRUNC

所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值小于等于阈值的部分不变

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用截断阈值法二值化
# 可以看到我们依然给了maxval,但是实际上这个maxval没有起作用,但是还是要写不然会报错
_,binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

3.4 低阈值零处理

THRESH_TOZERO

像素值小于等于阈值的部分被置为0,大于阈值的部分不变。

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用低阈值零处理二值化_,binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

3.5 超阈值零处理

THRESH_TOZERO_INV

像素值大于阈值的部分置为0,像素值小于等于阈值部分不变

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用超阈值零处理二值化
_,binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO_INV)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

3.6 OTSU阈值法

cv2.THRESH_OTS

 cv2.THRESH_OTS 并不是一个有效的阈值类型或标,它其实是用来计算合适阈值的方法,通常与 THRESH_BINARY 或 THRESH_BINARY_INV 结合使用

OTSU算法是通过一个值将这张图分前景背景

(也就是灰度图中小于这个值的是一类,大于这个值的是一类。例如,如果你设置阈值为128,则所有大于128的像素点可以被视作前景,而小于等于128的像素点则被视为背景。)

        通过统计学方法(最大类间方差)来验证该值的合理性,当根据该值进行分割时,使用最大类间方差计算得到的值最大时,该值就是二值化算法中所需要的阈值。通常该值是从灰度图中的最小值加1开始进行迭代计算,直到灰度图中的最大像素值减1,然后把得到的最大类间方差值进行比较。

import cv2 as cvimg = cv.imread('../images/flower.png')
flower = cv.resize(img,(200, 200))# 获得灰度图
gray = cv.cvtColor(flower, cv.COLOR_BGR2GRAY)# 使用OTSU阈值法二值化(默认是结合阈值法即THRESH_BINARY)
_,binary = cv.threshold(gray, 127, 255, cv.THRESH_OTSU)
# 结合反阈值法
_,binary1 = cv.threshold(gray, 0, 255, cv.THRESH_OTSU+cv.THRESH_BINARY_INV)cv.imshow('flower', gray)
cv.imshow('binary', binary)
cv.imshow('binary1', binary1)
cv.waitKey(0)
cv.destroyAllWindows()

3.7 自适应二值化

        其会对图像中的所有像素点计算其各自阈值,将图像划分为固定大小的块,然后对每个块进行阈值处理。

cv2.adaptiveThreshold

(image_np_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)

参数:

maxval:最大阈值,一般为255

adaptiveMethod:小区域阈值的计算方式:

ADAPTIVE_THRESH_MEAN_C:小区域内取均值

ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核

thresholdType:二值化方法,只能使用THRESH_BINARYTHRESH_BINARY_INV,也就是阈值法和反阈值法

blockSize:选取的小区域的面积,如7就是7\*7的小块。

C:最终阈值等于小区域计算出的阈值再减去此值
 

        自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理。

3.7.1 取均值

        从图片的左上角开始计算其邻域内的平均值,用一个均值卷积核来实现,将卷积核中心对准要阈值处理的像素,然后计算这个卷积核内所有像素的平均值,最后减去常数C得到该点阈值。

如图,如果像取第一个元素卷积核有空缺处,就按边缘填充的方式填充。

3.7.2 加权求和

        对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布。与取均值的区别就是采用另一种规则的卷积核进行阈值选择,函数中有着基本相同的参数。

3*3卷积核示例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Midnight Flag CTF 2025

周末还是三个比赛,可惜不好弄。不是远端连不上就是远端打不开。再有就是太难了。 Crypto ABC 这个题还是不算难的。给了两个30位数的平方和,并且pu1*baser0,qu2*baser1其中r 都很小,可以copper。 只是sage里的two_squres不管用&#xff0…

深度学习--激活函数

激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…

深入解析 OrdinalEncoder 与 OneHotEncoder:核心区别与实战应用

标题:深入解析 OrdinalEncoder 与 OneHotEncoder:核心区别与实战应用 摘要: 本文详细探讨了机器学习中类别特征编码的两种核心方法——OrdinalEncoder 和 OneHotEncoder。通过对比两者的功能、特点、适用场景及代码实现,帮助读者…

CTF web入门之命令执行 完整版

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…

【Linux实践系列】:用c/c++制作一个简易的进程池

🔥 本文专栏:Linux Linux实践项目 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 人生没有标准答案,你的错题本也能写成传奇。 ★★★ 本文前置知识: 匿名管道 1.前置知识回顾…

2.2 函数返回值

1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型:function -函数的ID:16进制的整数数值 -函数的值:封装在函数中的数据和代码 # - 函数是一块内存空间,通过…

【3GPP核心网】【5G】精讲5G网络语音业务系统架构

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 1. 音视频业务 2. 消息类业务 SMS over IMS SMS over NAS 3. 互联互通架构 3.1 音视频业务互通场景 3.2 5G 用户与 5G 用户互通 3.3 5G 用户与 4G 用户的互通…

系统环境变量有什么实际作用,为什么要配置它

系统环境变量有什么实际作用,为什么要配置它 系统环境变量具有以下重要实际作用: 指定程序路径:操作系统通过环境变量来知晓可执行文件、库文件等的存储位置例如,当你在命令提示符或终端中输入一个命令时,系统会根据环境变量PATH中指定的路径去查找对应的可执行文件。如果…

qt/C++面试题自用学习(更新中)

最近在找工作…面试中遇到了的问题总以为自己会但回答的时候磕磕巴巴,觉得还是要总结一下: vector和list的区别 vector list 底层数据结构 基于动态数组实现,元素在内存中连续存储 基于双向链表实现,元素在内存中非连续存储&…

Day09【基于Tripletloss实现的简单意图识别对话系统】

基于Tripletloss实现的表示型文本匹配 目标数据准备参数配置数据处理Triplet Loss目标Triplet Loss计算公式公式说明 模型构建网络结构设计网络训练目标损失函数设计 主程序推理预测类初始化加载问答知识库文本向量化知识库查询主程序main测试测试效果 参考博客 目标 在此之前…

说说什么是幂等性?

大家好,我是锋哥。今天分享关于【说说什么是幂等性?】面试题。希望对大家有帮助; 说说什么是幂等性? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 幂等性(Idempotence) 是指在某些操作或请求…

【自相关】全局 Moran’s I 指数

自相关(Autocorrelation),也称为序列相关性,指的是同一变量在不同时间或空间点的值之间的关系。简而言之,自相关就是一个变量与自身在不同位置或时间点的相关性 自相关:针对同一属性之间进行分析相关性 本…

【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8

🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…

KrillinAI:视频跨语言传播的一站式AI解决方案

引言 在全球内容创作领域,跨语言传播一直是内容创作者面临的巨大挑战。传统的视频本地化流程繁琐,涉及多个环节和工具,不仅耗时耗力,还常常面临质量不稳定的问题。随着大语言模型(LLM)技术的迅猛发展,一款名为Krillin…

AllDup:高效管理重复文件

AllDup 是一款免费高效的重复文件管理工具,专为 Windows 系统设计,支持快速扫描并清理冗余文件,优化存储空间。它通过智能算法识别重复内容,覆盖文本、图片、音频、视频等常见文件类型‌。软件提供便携版与安装版,无需…

C++进程间通信开发实战:高效解决项目中的IPC问题

C进程间通信开发实战:高效解决项目中的IPC问题 在复杂的软件项目中,进程间通信(Inter-Process Communication, IPC)是实现模块化、提高系统性能与可靠性的关键技术之一。C作为一门高性能的编程语言,广泛应用于需要高效…

用 Depcheck 去除Vue项目没有用到的依赖

1. 安装 Depcheck 插件 npm i -g depcheck 2. 运行命令,查看为用到的依赖 npx depcheck depcheck 3. 查询到所有为用到的依赖 E:\Project>depcheck Unused dependencies * riophae/vue-treeselect * codemirror * connect * qs * sortablejs * vue-count-t…

猿辅导集团推首个教育AI范式小猿AI 聚焦家校应用场景发布3款新品

近两年,通用大模型呈爆发式发展,垂类AI遭遇“技术平替”危机。 4月15日,猿辅导集团在“小猿AI暨智能硬件战略发布会”上,正式推出首个教育AI范式——“小猿AI”,并发布覆盖家校两端的“软件应用智能终端通识课程”三位…

英语单词 list 11

前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效,所以准备每天最多看一个 list ,真要提升英语水平,感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样,当然光知道这个表面意思还不够,还…