文章目录
一、彩色模型
1.1RGB彩色模型
RGB空间是生活中最常用的一个模型,电视机、电脑的CRT显示器等大部分都是采用这种模型。自然界中的任何一种颜色都可以由红、绿、蓝三种色光混合而成,现实生活中人们见到的颜色大多是混合而成的色彩。RGB彩色空间对应的坐标系统是如图所示的立方体。
关于RGB三通道的提取在先前的绪论中有简单提及,详情点击这里。
不过那部分是将RGB三通道通过特定的排布合成的彩色图像。要查看彩色图片的RGB信息可以通过opencv读取图像后分别对三个通道的数据进行显示:
贴个代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 加载彩色图片
image_path = 'img/image.jpg'
image = Image.open(image_path)
# 分离三个通道
r, g, b = image.split()
# 转换为灰度图像
gray_r = r.convert("L")
gray_g = g.convert("L")
gray_b = b.convert("L")
1.2CMY和CMYK彩色模型
CMY是颜料的原色:青(Cyan)、洋红或品红(Magenta)和黄(Yellow)三种颜色。常用于纸张彩色打印方面。而CMYK即为在CMY彩色模型上加上黑色。CMY和RGB其实是互补的颜色类型,CMY可由RGB转换得到:
[
C
M
Y
]
=
[
1
1
1
]
−
[
R
G
B
]
\begin{bmatrix}C \\M \\Y\end{bmatrix} = \begin{bmatrix}1 \\1 \\1\end{bmatrix} - \begin{bmatrix}R \\G \\B\end{bmatrix}
CMY
=
111
−
RGB
1.3HSI彩色模型
色调H(Hue):与光波的波长有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。
饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。
亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。
HSI是指一个数字图像的模型,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和亮度三种基本特征量来感知颜色。HSI模型的建立基于两个重要的事实:
第一个,分量与图像的彩色信息无关;
第二个,H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。
每个RGB像素的色调分量可用下式得到:
{
θ
if
B
≤
G
360
−
θ
if
B
>
G
\begin{cases}\theta & \text{if } B \leq G \\ 360 - \theta & \text{if } B > G \end{cases}
{θ360−θif B≤Gif B>G
其中,
θ
=
arccos
(
0.5
⋅
(
(
R
−
G
)
+
(
R
−
B
)
)
(
R
−
G
)
2
+
(
R
−
B
)
(
G
−
B
)
)
\theta = \arccos \left( \frac{0.5 \cdot ( (R - G) + (R - B) )}{ \sqrt{ (R - G)^2 + (R - B)(G - B) } } \right)
θ=arccos((R−G)2+(R−B)(G−B)0.5⋅((R−G)+(R−B)))
饱和度分量由下式得出:
S
=
1
−
3
⋅
min
(
R
,
G
,
B
)
R
+
G
+
B
S = 1 - \frac{3 \cdot \min(R, G, B)}{R + G + B}
S=1−R+G+B3⋅min(R,G,B)
强度分量由下式得出:
I
=
R
+
G
+
B
3
I = \frac{R + G + B}{3}
I=3R+G+B
贴个代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import colorsys
image_path = 'img/image.jpg'
image = Image.open(image_path)
rgb_array = np.array(image)
rgb_array = rgb_array / 255.0
hsi_array = np.zeros_like(rgb_array)
# 转换RGB到HSI
for i in range(rgb_array.shape[0]):
for j in range(rgb_array.shape[1]):
r, g, b = rgb_array[i, j]
h, s, i_val = colorsys.rgb_to_hsv(r, g, b)
hsi_array[i, j] = [h, s, i_val]
二、伪彩色图像处理
2.1灰度分层
伪彩色图像处理也叫假彩色图像处理,根据一定的准则对灰度值赋以彩色的处理。
灰度级分层是数字图像处理中的一种方法,用于将图像中的像素按照灰度值进行分组或分层处理。两大基本的灰度级分层方法是:
-
二值化(Binarization): 二值化是将图像中的像素根据其灰度值分为两个不同的组(通常是黑色和白色,或者前景和背景)。这是最简单和常用的分层方法之一。通过设置一个阈值,高于阈值的像素被分配到一组,低于阈值的像素被分配到另一组。这可以用来创建二值图像,例如文本提取、图像分割等应用。
-
多阈值分割(Multilevel Thresholding): 多阈值分割是一种将图像像素分为多个灰度级别的分层方法。与二值化不同,多阈值分割使用多个阈值来将像素分成多个组。这种方法通常用于图像分割、物体检测、图像增强等应用,可以在图像中识别不同的目标和特征。
贴个代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = 'img/gray.jpg'
gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 二值化
binary_threshold = 128
_, binary_image = cv2.threshold(gray_image, binary_threshold, 255, cv2.THRESH_BINARY)
# 八值化
eight_threshold = 32
eight_image = np.floor_divide(gray_image, eight_threshold) * eight_threshold
2.2灰度到彩色的变换
灰度图像转为伪彩色图像,效果如下:
贴个代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = 'img/gray.jpg'
gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
pseudo_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_JET)
三、彩色图像的分割
彩色空间分割是基于单色图像(灰度图)分割技术在不同颜色通道上实现的。灰度图分割技术常见的有:直方图阀值化、特征聚类、边缘检测、基于区域的、模糊技术、神经网络等。灰度图的分割方法都是基于区域像素的非连续性或相似性。基于非连续性的方法主要是为了检测孤立的点、边缘、线(灰度突然变化的地方)。基于相似性的方法包括阀值、聚类、区域分割合并等。
3.1RGB中的彩色图像分割
RGB 彩色图像分割是一种图像处理技术,旨在将彩色图像分割成具有语义或结构意义的不同区域或对象。彩色图像由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成,每个像素都由这三个通道的强度值组成。彩色图像分割旨在利用颜色信息和强度信息,将图像中的不同物体或区域进行分离和标记,以便进一步的分析和处理。
RGB 彩色图像分割可以分为不同的类型,每种类型都有其特定的应用领域和目标。以下是一些常见的 RGB 彩色图像分割类型:
1.基于颜色信息的分割: 这种方法利用像素的颜色信息,将图像中具有相似颜色的像素分为一组。它可以用于检测色彩鲜明的物体,如交通标志、水果等。
2.基于纹理信息的分割: 纹理分割利用图像中不同区域的纹理特征来进行分割。例如,可以用于区分不同类型的材质,如草地、砖墙等。
3.基于强度信息的分割: 这种方法使用图像的强度信息(通常是灰度值)来进行分割。它适用于图像中强度变化较大的区域,如阴影、光照变化等。
4.基于混合信息的分割: 这种方法综合利用颜色、纹理和强度等多种信息来进行分割,从而更准确地识别和分离不同的区域。
5.基于区域的分割: 这种方法首先将图像划分为不同的区域,然后根据区域内的特征对每个区域进行分割。区域可能根据像素的相似性、连通性等进行定义。
6.语义分割: 这是一种高级的分割方法,旨在将图像中的每个像素分配到具有语义意义的类别中,如人、车、树等。它在计算机视觉和深度学习中具有重要应用。
RGB中的彩色图像分割通过将彩色图像转换到 HSV 颜色空间,然后通过设定颜色范围(在 HSV 空间中定义)进行颜色分割。
贴个代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取彩色图像
image_path = 'img/image.jpg'
color_image = cv2.imread(image_path)
# 转换颜色空间为 HSV
hsv_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2HSV)
# 定义颜色分割的范围
lower_range = np.array([30, 50, 50])
upper_range = np.array([120, 255, 255])
# 创建掩码
mask = cv2.inRange(hsv_image, lower_range, upper_range)
# 进行分割
segmented_image = cv2.bitwise_and(color_image, color_image, mask=mask)
3.2彩色边缘检测
彩色图像边缘检测是一种在彩色图像中识别边缘和轮廓的图像处理技术。边缘是图像中颜色、亮度或纹理等方面的不连续性区域,通常代表着物体之间的界限或重要的特征。彩色图像边缘检测的目标是找到这些边缘,以帮助分析、识别和处理图像中的物体和结构。
在彩色图像中,每个像素有三个颜色通道(红、绿、蓝),因此彩色图像边缘检测相对于灰度图像边缘检测更加复杂。通常,彩色图像边缘检测可以通过以下步骤来实现:
1.颜色空间转换: 首先,将彩色图像从 RGB(红、绿、蓝)颜色空间转换为其他颜色空间,例如灰度(Grayscale)或 HSV(色调、饱和度、亮度)。颜色空间转换有助于减少处理的复杂性并提取出图像的亮度信息。
2.灰度化: 如果将图像转换为灰度图像,这一步骤将在颜色通道上进行加权平均,以便在单个通道中表示图像的亮度信息。这有助于简化后续的边缘检测过程。
3.边缘检测算法: 应用边缘检测算法,例如 Canny、Sobel、Prewitt 等,来检测图像中的边缘。这些算法通常基于图像亮度或梯度的变化来识别边缘。
4.边缘增强: 对检测到的边缘进行增强,以便更好地突出图像中的轮廓。
5.后处理: 根据应用的需求,可能需要进行降噪、连接断裂的边缘、滤除不重要的边缘等后处理步骤。
彩色图像边缘检测在计算机视觉、图像处理、模式识别等领域具有广泛的应用。它可以用于目标检测、物体识别、图像分割、图像增强、图像分析等任务。边缘检测结果通常用于提取图像中的重要特征,为进一步的图像处理和分析提供基础。
贴个代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = 'img/image.jpg'
color_image = cv2.imread(image_path)
gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, threshold1=100, threshold2=200)