新手村(三)-读取、索引、修改图片

1.基本知识

一个彩色的数字图像是由三维矩阵构成的,三个维度分别是(高度,宽度,通道数)。在OpenCV中,默认采用BGR通道,即三个通道以蓝色、绿色、红色排列。

Understanding Images with skimage-Python | by Mathanraj Sharma ...
图片三通道示意图

图片中某个点某个通道的数值,可以用8位正整数或者浮点数表示。如果是8位正整数,其数值范围在0-255之间。三个通道不同的数值相组合,就可以产生五彩缤纷的颜色。注意,(0,0,0)表示黑色,(255,255,255)表示白色。

Color Approximation :: Color (Image Processing Toolbox User's Guide)
色彩空间

2.读取和查看图像

使用imread读入图像

import cv2

I = cv2.imread("opencv.jpg")

在Spyder的Variable Explorer中可方便的查看该图像的矩阵表示。由于图像是三维矩阵,所以要进行查看,首先要固定一个维度。在窗口的Axis选项中选择固定哪个维度,在Index选项中选择该维度固定的数值,如图所示,Axis=2表示固定第3个维度(因为从0开始),即通道维度;Index=1表示查看第二个通道,即绿色通道(G)。

变量查看器

3.访问图像性质和像素数值

用shape和dtype属性查看图像的尺寸和数据类型

要查询图像上某个点某个通道的值,使用Numpy的方括号进行引用。此处要注意一点,一般图像坐标系默认以左上角为原点,宽度方向为X轴,高度方向为Y轴,如下图所示

Image Coordinate Systems - MATLAB & Simulink
图像坐标

但访问矩阵时,我们应该先写行,后写列,因此,假设我们要访问图像上x=100,y=50的蓝色通道值(第0个通道),应该写作

I[50,100,0]

即采用[y坐标,x坐标,通道]的顺序。

4.访问图像区域

访问图像上区域,与访问Numpy矩阵中区间的原理相同。在某个维度上写a:b,即表示[a,b)的左闭右开区间。

明白了这个道理之后,假设我们想访问图像中从左上角x=140, y=30的点,到右下角x=230, y=110的矩形区域,则可以写作

I[30:111, 140:231, :]

注意之前提到的x,y顺序,和区间范围的问题。注意到,在通道这个维度,我们只写了 : 这一个符号,这表示包含所有通道。这也是Numpy索引通用的写法,单独一个冒号表示区间整体,冒号右边不写,例如x[2:]代表从2到区间结束,左边不写,例如x[:40]代表从0到40(不包含40),等等。

如有问题,欢迎在评论区进行提出。

Be the first to comment

Leave a Reply

Your email address will not be published.


*