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

news2025/4/16 12:36:24

一.图像色彩空间转换

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 cv

img = 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 cv

img = 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 cv

img = 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 cv

img = 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 cv

img = 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 cv

img = 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 cv

img = 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 cv

img = 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.coloradmin.cn/o/2335956.html

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

相关文章

项目交接时信息遗漏,如何预防

项目交接时,信息遗漏可能导致任务延误、质量下降和团队混乱,因此,建立系统化的交接流程和使用专业的工具是防止信息遗漏的有效策略。交接过程中的信息丢失往往源自沟通不畅、文档不完整或者责任不明确等问题,这不仅影响项目的顺利…

【AI量化第24篇】KhQuant 策略框架深度解析:让策略开发回归本质——基于miniQMT的量化交易回测系统开发实记

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 本篇要讲到量化的核心了——策略。说白了每个投资者…

向量数据库Qdrant 安装 不使用docker

一、导读 环境:Ubuntu 24.04、Windows 10、WSL 2、Qdrant 1.13.4 背景:换了新工作,使用qdrant作为向量库,需要不使用docker安装 时间:20250415 说明:初入职,不了解,暂且记下 二、…

微电网与分布式能源:智能配电技术的场景化落地

安科瑞顾强 随着数字化转型与能源革命的加速推进,电力系统正经历从传统模式向智能化、网络化方向的深刻变革。用户侧的智能配电与智能用电技术作为这一变革的核心驱动力,正在重塑电力行业的生态格局。本文将从技术架构、应用场景及未来趋势等维度&#…

Web三漏洞学习(其一:文件上传漏洞)

靶场:云曦历年考核题 一、文件上传 在此之前先准备一个一句话木马 将其命名为muma.txt 23年秋期末考 来给师兄上个马 打开环境以后直接上传muma.txt,出现js弹窗,说明有前端验证 提示只能上传.png .jpg 和 .gif文件,那就把muma.txt的后缀…

Web三漏洞学习(其二:sql注入)

靶场:NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过,但为了学习sql,整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…

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

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

gravity`(控制 View 内部内容的对齐方式)

文章目录 **1. 常用取值****示例** **2. layout_gravity(控制 View 在父容器中的对齐方式)****常用取值****示例** **3. gravity vs layout_gravity 对比****4. 注意事项****5. 总结** 作用对象:当前 View 的内部内容(如 TextView…

gitdiagram源码架构分析

https://github.com/ahmedkhaleel2004/gitdiagram 整体架构分析 前端请求入口: 后端对应接口: 后端调试 后端调试:会提示api_key失败的问题: 有两种方法解决: 1、注释掉下面的行代码; 方法二&#xff1…

蓝光三维扫描:汽车冲压模具与钣金件全尺寸检测的精准解决方案

随着汽车市场竞争日趋激烈,新车型开发周期缩短,安全性能要求提高,车身结构愈加复杂。白车身由多达上百个具有复杂空间型面的钣金件,通过一系列工装装配、焊接而成。 钣金件尺寸精度是白车身装配精度的基础。采用新拓三维XTOM蓝光…

深度学习占用大量内存空间解决办法

应该是缓存的问题,关机重启内存多了10G,暂时没找到别的方法 重启前 关机重启后

Matlab绘制函数方程图形

Matlab绘制函数方程图形: 多项式计算: polyval 函数 Values of Polynomials: polyval ( ) 绘制方程式图形: 代码如下: >> a[9,-5,3,7]; x-2:0.01:5; fpolyval(a,x); plot(x,f,LineWidth,2); xlabel(x); ylabel(f(x))…

电视盒子 刷armbian

参考 中兴电视盒子中兴B860AV3.2-M刷Armbian新手级教程-CSDN博客 1.刷安卓9 带root版本 a. 下载安卓线刷包 链接:https://pan.baidu.com/s/1hz87_ld2lJea0gYjeoHQ8A?pwdd7as 提取码:d7as b.拆机短接 3.安装usbburning工具 使用方法 ,…

AI应用开发之扣子第一课-夸夸机器人

首先,进入官网:点击跳转至扣子。 1.创建智能体 登录进网站后,点击左上角+图标,创建智能体,输入智能体名称、功能介绍 2.输入智能体提示词 在“人设与回复逻辑”输入以下内容: # 角色 你是一…

【计算机网络实践】(十二)大学校园网综合项目设计

本系列包含: (一)以太网帧分析与网际互联协议报文结构分析 (二)地址解析协议分析与传输控制协议特性分析 (三)交换机的基本操作、配置、 虚拟局域网配置和应用 (四)交…

uniapp小程序位置授权弹框与隐私协议耦合(合而为一)(只在真机上有用,模拟器会分开弹 )

注意: 只在真机上有用,模拟器会分开弹 效果图: 模拟器效果图(授权框跟隐私政策会分开弹,先弹隐私政策,同意再弹授权弹框): manifest-template.json配置( "__usePr…

【星闪模组开发板WS8204SLEBLEModule】星闪数据收发测试

目录 开发板简介 串口设置 主从模式设置 AT命令数据发送 透传模式数据发送 结语 本文首发于《电子产品世界》论坛:【星闪模组开发板WS8204SLE&BLEModule】星闪数据收发测试-电子产品世界论坛https://forum.eepw.com.cn/thread/392011/1 感谢eepw论坛和成…

基础知识:Dify 错误排查

Case1:Dify 卡在管理员界面 查看容器状态 docker compose ps 可以看到有个容器异常:docker_db_1 的状态是 Restarting(表示一直在重启) 解决方案 参考:https://github.com/langgenius/dify/issues/5731

spring cloud微服务断路器详解及主流断路器框架对比

微服务断路器详解 1. 核心概念 定义:断路器模式通过快速失败机制防止故障扩散,当服务调用出现异常或超时时,自动切换到降级逻辑,避免级联故障。核心功能: 熔断:在故障阈值(如错误率&#xff09…

(小白0基础) 微调deepseek-8b模型参数详解以及全流程——训练篇

​ 本篇参考bilibili如何在本地微调DeepSeek-R1-8b模型_哔哩哔哩_bilibili 上篇:(小白0基础) 租用AutoDL服务器进行deepseek-8b模型微调全流程(Xshell,XFTP) —— 准备篇 初始变量 max_seq_length 2048 dtype None load_in_4bit True单批次最大处理模型大小dy…