感谢 杨秀璋的专栏,本文参考了 Eastmount 的 文章 https://blog.csdn.net/Eastmount/article/details/81748802。
我的运行环境:
我的python:3.7.4
我的操作系统:win10
我的opencv库:4.1.1.26
用windows自带的画图软件,准备了三幅图:图幅均为长200像素,高100像素。
图1:填充的颜色为红=0,绿=0,蓝=255;文件名:B200x100.bmp
图2:填充的颜色为红=0,绿=255,蓝=0;文件名:G200x100.bmp
图3:填充的颜色为红=0,绿=0,蓝=255;文件名:R200x100.bmp
实验目的:
内存中图像的颜色是怎么表示的?
实验步骤:
说明:
1. 在windows的cmd窗口下交互执行python命令。
2. 加载cv2模块。前提:安装了opencv库。安装方法
3. 加载当前目录中的指定的图像文件。
4. 读取图像中的任意一点像素。因是纯色图案,各点像素值应该相同。我取了坐标(50,50)的像素。
5. 像素值=(255,0,0)。
6. 结果表明,像素值用了三个通道表示,其中第一个通道为蓝色通道。
7. 结果表明,图像i的(x,y)像素的蓝色通道值可表示为:i[y,x,0]
继续实验:
说明:
1. 加载绿色图像。
2. 坐标(50,50)的像素值=(0,255,0)
3. 结果表明:第二个通道为绿色通道,图像i的(x,y)像素的绿色通道值可表示为:i[y,x,1]
继续实验:
说明:
第三个通道的红色通道, 图像i的(x,y)像素的红色通道值可表示为:i[y,x,2]
图像i的点坐标(x,y)处的像素,到底表示为i[x,y]还是i[y,x]?
继续实验:
说明:
1. 加载红色图像。
2. 将图像的10<=m<=20, 30<=n<=50范围内的像素设置成黑色(BGR通道均为0)
3. 将图像保存为RedBlack.bmp文件。
4. 用windows自带的画图软件打开RedBlack.bmp
结果表明,m表示行,也就是y坐标的值;n表示列,也就是x坐标的值。原点为左上的起点。
可用i[y,x]表示图像i的(x,y)点的像素;
可用i[y1:y2,x1:x2]表示图像i的(x1,y1)至(x2,y2)范围内的像素;
认识i[k]
看起来i=cv2.imread()的i就代表了像素,那么R200x100.bmp有多少像素呢?输入len(i)试试:
怎么就100个像素?应该200*100=20000呀?
用画图打开R200x100.bmp,将属性宽200像素改为20像素,另存为R20x100.bmp
继续实验:
还是100?好像有点懂了。
用画图打开R20x100.bmp,将属性高100像素改为30像素,另存为R20x30.bmp
继续实验:
变成30了。
这里,img的成员数就是图像的行数。剥开外壳看看:
说明:
img由行组成:img[行0,行1,...行m]
行由像素组成:行[列0,列1,...列n]
像素由通道值组成: 行列[蓝,绿,红]
说明:第0行由20个像素 (20列)组成,每个像素都是红色,数据类型为无符号8位数(256色)--这是我用画图存盘时选择的。
说明:第0行第5列的像素是256色中的红色。