图像处理初步

本文最后更新于:3 个月前

CV非常依赖图像处理的基本知识!注意学习图像的基础知识

图像的基本知识

不同的色彩空间:

  • 灰度 1byte 描述灰白图像,一个数值,单通道

  • RGB 3byte 描述一张彩色图像,3个数值,一般是三通道,但是可以通过压缩,让RGB三个数值总共占16bit(比如RGB 565),即两通道

    • BGR 交换了色彩通道,不同的框架在显示图片时默认的色彩空间是不一样的,但图片的二进制一样,因此颜色可能会出现问题。
  • HSV

    • Hue: 色相,用角度度量的色彩 红色为0°,绿色为120°,蓝色为240°,其实吧,直接通过Hue就可以看出来颜色了啊?
    • Saturation: 饱和度, 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。 「人话就是:颜色的纯度。控制饱和度的方式是在颜色中加入白色,这个值越大,加入的白色越少,颜色就越纯,换句话说,圆盘的中心就是白色,外圈则是纯色」
    • Value: 明度. 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白) 「和饱和度相对应,就是在颜色中加入黑色的量,这个值越大,加入的黑色越少,明度就越高」
  • HSL

    • Hue 还是色相,这和HSV是完全一样的
    • Saturation,这个和HSV的饱和度机制不同,具体如何生效?
    • Lightness:图像亮度 「它一项就相当于HSV中的S和V,最亮为白色,最暗为纯黑色,所以可以看到HSL最上面一圈是白的,最下面一圈是黑的」
    • 他们的具体区别如下图所示 (左为HSL,右为HSV)
  • YUV

    • 颜色编码方法。 考虑到人类的色彩感知能力,在编码时对信息进行下采样
    • Y:明度(灰阶值), U&V(色度,描述色彩和饱和度)
    • 出现在彩色和黑白电视的过渡时期。

图像的变换(直接处理)

反色变换

目标:增加暗色背景图像里的明亮区域

如果图像灰度值范围为 [0, L], 则反色变换为

\(输出灰度值output = 最大灰度值L - 输入灰度值input\)

也就是说,输出灰度矩阵中的每个点的灰度,是原图像中最大灰度点的灰度 - 自己本身的灰度

​ (如图像最大灰度为160,这个像素点的灰度为20,那么转换后它的灰度为 160-20 = 140)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np   # matrix manipulation
from PIL import Image # read image from hard disk
import matplotlib.pyplot as plt # matplotlib中的绘图工具

def image_inverse(input):
value_max = np.max(input) # 求出图片的最大灰度值,注意这里是一个整型
output = value_max - input # 利用numpy的广播机制,使得value

if __name__ == '__main__':
# asarray 将图像转变为numpy矩阵
gray_img = np.asarray(Image.open('./x.jpg').convert('L'))
inv_img = image_inverse(gray_img)

fig = plt.figure()
ax1 = fig.add_subplot(121) # 指图像数量为一行两列, 第三个1为1号位置
ax1.set_title('before')
# cmap = 'gray' 意味着图像以灰度图像的形式显示
ax1.imshow(gray_img, cmap = 'gray', vmin = 0, vmax = 255)

ax2 = fig.add_subplot(122)
ax2.set_title('after')
ax2.imshow(inv_img, cmap = 'gray', vmin = 0, vmax = 255)

plt.show()