前言

  聊聊二维 CV 一些基础性的东西。
  所谓的二维计算机视觉,是我自取的一个名词。所谓二维,即是指静态的、二维的(即图像),与这两个词相对应的是动态的(即视频)、三维的(即 3D 的一些东西)。二维 CV 根据研究的问题大致可以分为:图像表征、理解、变换、生成以及静态的目标检测与语义分割等等。

1、图像的基本概念

1.1 图像

  在深度学习领域中,图像即指数字图像,即由模拟图像数字化得到的,一般使用二维矩阵存储的数据。

1.2 颜色与颜色通道

  在现代颜色视觉理论中,任何颜色都可以通过红(R)、绿(G)、蓝(B)三种颜色混合得到。
  颜色通道,也叫做色彩模式,即是指图片的颜色是由哪几种基本颜色混合得到的,当然最常见的色彩模式记为 RGB 模式,此时图片颜色通道数为 3。

2、深度学习中常用的图像读取方式

  参考:图片的读取方式以及 pytorch 种可能用到的各种数据格式转换

2.1 图像的读取

  • matplotlib.pyplot.imread
import matplotlib.pyplot as plt
img = plt.imread(path)
  • cv2.imread(path)
import cv2
img = cv2.imread(path)
  • PIL.Image.open
from PIL import Image
img = Image.open(path)

2.2 各种方式的区别

  类型上,PIL 为 PIL.JpegImagePlugin.JpegImageFile,其他 2 种读取的图片格式均为 numpy.ndarray 格式;
  维度上,除了 PIL 其它都是 H,W,C,PIL 是 W,H,C。
  通道上,除了 opencv(cv2)读进来的顺序是 BGR,其他都是 RGB。

2.3 ndarray 与 tensor 的转换

  PIL.Image/numpy.ndarray 转化为 Tensor,常常用在训练模型阶段的数据读取,而 Tensor 转化为 PIL.Image/numpy.ndarray 则用在验证模型阶段的数据输出。tensor 分为 gpu 上和 cpu 上的,GPU 上的 tensor 不能直接转换为 numpy,需要先转换为 CPU 上的 tensor。ndarray(cv2)就是各种格式之间的中转)。由于 PIL 用得少所以这里就不考虑它了。

  • ndarray–>tensor:转化成的 Tensor 的数据类型是由 ndarray 的数据类型决定的。值得注意的是,在 pytorch 中通常图片表示为N,C,H,W
def toTensor(img):
    assert type(img) == np.ndarray,'the img type is {}, but ndarry expected'.format(type(img))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = torch.from_numpy(img.transpose((2, 0, 1)))
    return img.float().div(255).unsqueeze(0)  # 255也可以改为256
  • tensor–>ndarray:同样要转换一下
def tensor_to_np(tensor):
    img = tensor.mul(255).byte()
    img = img.cpu().numpy().squeeze(0).transpose((1, 2, 0))
    return img # opencv 格式下的图片
如果觉得我的文章对你有用,请随意赞赏