目录
一、彩色模型
GRB:绿、红、蓝
CMY:青、粉红、黄
CMYB:青、粉红、黄、黑
HSI:色调、饱和度、亮度
色调与饱和度称为色度,颜色可以用色度和亮度来表示
1、GRB彩色模型
图中RGB原色值位于3个角,二次色青色、深红色和黄色位于另外3顶点上,黑色位于原点处,白色位于离原点最远的角上。(颜色都归一化)
每幅红、绿、蓝图像都是一幅8比特图像,全彩色表示24比特的RGB图像。
但实际使用的只有216种稳定色。(000000~FFFFFF)

2、CMY和CMYK彩色模型
青色、深红色,黄色是光的二次色
CMY适用于彩色打印机和复印机。要求输入CMY数据或在内部将RGB转换为CMY,加入黑色就变成了CMYK
3、HSI彩色模型
HSI:色调、饱和度、亮度
色调是观察者感觉到的主要颜色。
饱和度是一种纯色被白光稀释的程度的度量,体现了无色的强度的概念,即颜色的深浅和浓淡程度。
亮度是人眼感觉光的明暗程度。





二、伪彩色图像处理
伪彩色图像处理是指基于一种指定的规则对灰度值赋以颜色的处理。主要应用是对单幅图像或序列图像中灰度级事件的人类可视化和解释。
1、灰度分层
把大于一定值或小于一定值的灰度级赋予一种灰度,把其余灰度级赋予另一种灰度。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 二值映射
def slice_a(img):
h,w = img.shape[0],img.shape[1]
new_img = np.zeros((h,w))
for i in range(h):
for j in range(w):
if img[i,j] <192 or img[i,j]>230:
new_img[i, j] = 255
else:
new_img[i,j] = 0
return new_img
img = cv2.imread('a.jpg',0) # 0是灰度,1是彩色
fig_a = slice_a(img)
cv2.namedWindow('input', 0)
cv2.imshow("input", img)
cv2.namedWindow('fig_a', 0)
cv2.imshow("fig_a", fig_a)
cv2.waitKey(0)

2、灰度到彩色的变换
对任何输入像素的灰度执行3个独立的变换,然后将这3个变换结果分别送入彩色电视监视器的红绿蓝通道。用这种方法产生一幅合成图像,合成图像的彩色内容由变换函数(可以是平滑的非线性函数)的特性调制。
注意:是在图像亮度值上进行的变化,和位置无关。
三、全彩色图像处理
处理方法分为两大类:
1、分别处理每一幅图像的分量,然后由分别处理过的分量图像形成一幅处理过的合成彩色图像。对每个分量的处理技术可以应用到对灰度图像处理的技术上,但这种通道式的独立处理技术忽略了通道间的相互影响。
2、直接处理彩色像素(向量)。全彩色图像至少有3个分量,所以彩色像素实际上是向量。
import cv2
import numpy as np
img = cv2.imread('a.jpg')
r,g,b = cv2.split(img)
m = cv2.merge([r, g, b])
cv2.namedWindow('input', 0)
cv2.imshow("input", img)
cv2.namedWindow('output', 0)
cv2.imshow('output',m)
cv2.waitKey(0)

四、彩色变换
1、补色
补色:彩色环上,与色调直接相对的另一端。
补色对于增强嵌在彩色图像暗区的细节很有用,特别是区域在大小上占优势时。
在RGB中做反转是一分量对一分量的,但是,在HSI中,反转图的S分量不能从原图的S分量单独获得。
2、彩色补偿
有些图像处理任务的目标是根据颜色分离出不同类型的物体。但由于常用的彩色成像设备具有较宽且相互覆盖的光谱敏感区,加之待拍摄图像的染色是变化的,所以很难再3个分量图中将物体分离出来,这种现象称为颜色扩散。彩色补偿的作用就是通过不同的颜色通道提取不同的目标物。
3、彩色分层
突出图像中某个特定彩色区域对从其周围分离出目标物体很有用。
对彩色图像进行分层的简单方法之一是,把某些感兴趣区域之外的彩色映射为不突出的中性颜色。
4、色调和彩色校正
在图像形成、运输、显示过程中,存在非线性可能造成颜色的不平衡。
5、直方图处理
直方图均衡化基本思想是对图像中像素个数多的灰度级进行扩展,而对图像中像素个数少的灰度进行压缩,从而扩展像素的取值范围,提高对比度和灰度色调的变化,使图像更加清晰。
直方图均衡化一来可以提高图像的对比度,二来可以把图像变换成像素值是几乎均匀分布的图像。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 生成图像直方图
plt.figure(0)
img=np.array(Image.open('b.jpg').convert('L'))
arr=img.flatten()
n, bins, patches = plt.hist(arr, bins=256, normed=1, facecolor='green', alpha=0.75)
# 直方图均衡
img = cv2.imread("b.jpg")
cv2.namedWindow('input_image', 0)
cv2.resizeWindow("input_image", 500,700);
cv2.imshow("input_image", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.namedWindow('output_image', 0)
cv2.imshow("output_image", result)
result = Image.fromarray(result)
img=np.array(result.convert('L'))
arr=img.flatten()
plt.figure(1)
n, bins, patches = plt.hist(arr, bins=256, normed=1, facecolor='green', alpha=0.75)
plt.show()


五、平滑和锐化
1、平滑
和灰度图像平滑类似。
在一幅RGB彩色图像中,令Sxy表示中心位于(x,y)的邻域定义的一组坐标。在该邻域中RGB分量的向量平均值为:

将该向量的分量视为几幅标量图像,每幅标量图像可以通过灰度级邻域处理,单独平滑RGB图像的每个分量。
结论:邻域平均平滑可以在每个彩色平面的基础上进行,其结果与使用RGB彩色向量执行平均是相同的。
2、锐化
使用拉普拉斯算子进行图像锐化。
在RGB彩色模型中,向量c的拉普拉斯变换为:
故可通过计算每幅图像的拉普拉斯变换来计算全彩色图像的拉普拉斯变换。
六、基于彩色的图像分割
分割是把一幅图像分成多个区域的处理。
1、HSI彩色空间的分割
如果我们希望以彩色为基础来分割一幅图像,则可在HSI空间中,利用色调不同进行分割,将饱和度作为一个模板。彩色图像分割中不常使用亮度图像,因为它不携带彩色信息。
2、RGB向量空间中的分割
分割用RGB向量能得到更好的结果。
假定我们的目的是在RGB图像中分割一个特定染色区域的物体。给定一组感兴趣的有代表性彩色的彩色样点集,可得到我们希望分割的颜色的“平均”估计。用RGB向量a来表示这个平均彩色。分割的目的是将给定图像中的每个RGB像素按照是否具有指定范围内的颜色来划分。最简单的相似性度量是欧式距离。
令z表示RGB空间中的任意一点。若z和a之间的距离小于特定的阈值D0,则称它们相似。z和a间的欧式距离如下:
其中下标R、G、B表示向量a和z的RGB分量。
上式的推广是形如下式的距离度量:
其中C表示我们希望分割的有代表性颜色的样本的协方差矩阵。
3、彩色边缘检测
import cv2
import numpy as np
#Sobel算子
def sobel_demo(image):
grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0) #对x求一阶导
grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1) #对y求一阶导
gradx = cv2.convertScaleAbs(grad_x) #用convertScaleAbs()函数将其转回原来的uint8形式
grady = cv2.convertScaleAbs(grad_y)
cv2.namedWindow('gradient_x', 0)
cv2.imshow("gradient_x", gradx) #x方向上的梯度
cv2.namedWindow('gradient_y', 0)
cv2.imshow("gradient_y", grady) #y方向上的梯度
gradxy = cv2.addWeighted(gradx, 0.5, grady, 0.5, 0) #图片融合
cv2.namedWindow('gradient', 0)
cv2.imshow("gradient", gradxy)
src = cv2.imread('a.jpg')
cv2.namedWindow('input_image', 0)
cv2.imshow('input_image', src)
sobel_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

七、彩色图像中的噪声
彩色图像的噪声内容在每个彩色通道中具有相同的特性,但噪声对不同彩色通道锁造成的影响不同。一种可能是个别通道的电子学故障。然而,不同的噪声水平更可能是由每个彩色通道的相对照射强度的差异造成的。
八、彩色图像压缩
描述彩色所要求的比特数比描述灰度级所要求的比特数大3~4倍,所以数据压缩在存储和传输彩色图像中很重要。
压缩:减小或消除冗余和/或不相干数据的处理。