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

一.图像色彩空间转换

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级灰度

python 复制代码
# 在读取时也可以直接将其转化为灰度图
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,这是经过大量实验得到的一个权重比例,也是一个比较常用的权重比例

python 复制代码
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)

python 复制代码
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

与阈值法相反

python 复制代码
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

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

python 复制代码
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,大于阈值的部分不变。

python 复制代码
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 ,像素值小于等于阈值部分不变

python 复制代码
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_BINARYTHRESH_BINARY_INV 结合使用

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

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

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

python 复制代码
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卷积核示例:

相关推荐
小爷毛毛_卓寿杰3 分钟前
检索增强的 NLP2SQL 生成
人工智能
柠檬味拥抱4 分钟前
基于YOLOv8的PCB缺陷检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
人工智能
vlln5 分钟前
【论文解读】MemGPT: 迈向为操作系统的LLM
人工智能·深度学习·自然语言处理·transformer
struggle202512 分钟前
LLMControlsArm开源程序是DeepSeek 控制熊猫机械臂
人工智能·python·cmake·jupyternotebook·deepseek
奔跑吧邓邓子26 分钟前
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
人工智能·智慧能源·deepseek·微电网优化调度
EasyDSS28 分钟前
EasyRTC嵌入式音视频通信SDK助力物联网/视频物联网音视频打造全场景应用
人工智能·音视频
Oliverro28 分钟前
人脸识别技术成为时代需求,视频智能分析网关视频监控系统中AI算法的应用
网络·人工智能
点云SLAM35 分钟前
PyTorch中matmul函数使用详解和示例代码
人工智能·pytorch·python·深度学习·计算机视觉·矩阵乘法·3d深度学习
love530love1 小时前
【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
开发语言·人工智能·windows·笔记·python·rust·virtualenv
VR最前沿1 小时前
Xsens-AAA工作室品质,为动画师准备
人工智能·科技