【1】引言
前序文章中,我们已经学会了用numpy规划数据控制像素大小,然后用像素规划矩阵,对矩阵赋值后输出灰度图,相关链接为:
python学opencv|读取图像(八)用numpy创建纯黑灰度图-CSDN博客
python学opencv|读取图像(九)用numpy创建黑白相间灰度图-CSDN博客
在此基础上,我们自然会想到创建彩色图像。写这篇文章的目的就是和大家一起学习,然后狠狠掌握该技能。
【2】代码测试
【2.1】绘制灰度图像
首先回顾一下先前的学习知识,熟悉灰度图生成的技巧。在pycharm等编辑器中输入下述代码:
import numpy as np #引入numpy模块
import cv2 as cv #引入cv2模块
from imageio.v2 import imwrite
#定义图像
t=np.arange(300,600,20) #定义变量,在[300,600)区间,每隔20取一个值
t_max=np.max(t) #取变量最大值作为像素大小
print('t_max=',t_max) #输出最大值
image=np.zeros([t_max,t_max],np.uint8) #定义一个竖直和水平像素均为t_max的全0矩阵
#显示和保存定义的图像
cv.imshow('display-pho',image) #显示图像
cv.imwrite('gray-pho.png',image) #保存图像
cv.waitKey() #图像不关闭
cv.destroyAllWindows() #释放所有窗口
代码分成三部分:引入模块,定义数据(像素)生成矩阵(BGR),展示和保存图像。
在此基础上,我们看到构成各像素点对应BGR的矩阵全部是0,所以输出的是灰度图,具体对应代码为:
image=np.zeros([t_max,t_max],np.uint8) #定义一个竖直和水平像素均为t_max的全0矩阵
而在先前的学习过程中,我们已经明确知道:灰度图像的BGR通道是1,而彩色图像的BGR通道是3,相关文章为:
python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客
在此基础上,我们想办法把二维的矩阵如np.zeros()升级为三维矩阵,把各个BGR对应的数据从1个数变成3个数,实现满足彩色图像BGR通道数为3的要求,这样就可以构建彩色图像。
【2.2】绘制彩色图像
创建彩色图像的第一步是把纯0矩阵改成三维矩阵:
image=np.zeros([t_max,t_max,3],np.uint8) #定义一个竖直和水平像素均为t_max的全0矩阵
然后在这个基础上我们会发现输出的图像是纯黑色的,如图1,这是因为所有通道的数据都是0。
图1
要想输出彩色图像,下一步就是更新通道颜色:
首先把第一个通道的值全部改成155(数据在[0,255]内随意填写):
image[:,:,0]=155 #第一个通道值
此时会输出一张纯蓝色图像,如图2:
图2
然后继续,把第二个通道的颜色设置成200:
image[:,:,1]=200 #第二个通道值
此时出现了一张绿色图,如图3:
图3
然后继续,把第三个通道的颜色设置成255:
image[:,:,2]=255 #第三个通道值
此时获得一张褐色图,如图4:
图4
此时的完整代码为:
import numpy as np #引入numpy模块
import cv2 as cv #引入cv2模块
from imageio.v2 import imwrite
#定义图像
t=np.arange(300,600,20) #定义变量,在[300,600)区间,每隔20取一个值
t_max=np.max(t) #取变量最大值作为像素大小
print('t_max=',t_max) #输出最大值
image=np.zeros([t_max,t_max,3],np.uint8) #定义一个竖直和水平像素均为t_max的全0矩阵
image[:,:,0]=155 #第一个通道值
image[:,:,1]=200 #第二个通道值
image[:,:,2]=255 #第三个通道值
#显示和保存定义的图像
cv.imshow('display-pho',image) #显示图像
cv.imwrite('gray-pho-3.png',image) #保存图像
cv.waitKey() #图像不关闭
cv.destroyAllWindows() #释放所有窗口
实际上图4是三个通道值分别为155,200和255 的综合效果,如果想就按单个通道设置的效果,可以只保留想要的通道,在其余通道的代码前增加#。比如只想看第二个通道,就参照下述方式修改代码:
#image[:,:,0]=155 #第一个通道值 image[:,:,1]=200 #第二个通道值 #image[:,:,2]=255 #第三个通道值
【2.3】彩色图像进阶
上述彩色图像是纯色的,如果我们想多一点颜色,就继续修改代码,此处使用的方法是将每一个通道内的数据都变成变化的,代码如下:
# 第一个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 0] = 0.2*(i+j) # 第一个通道值 # 第二个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 1] = 200*np.cos(i+j)+55*np.tan(j) # 第二个通道值 # 第三个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 2] = 255*np.tanh(i+j) # 第三个通道值
运行后获得的图像为:
图5
这个图像很有布料的感觉。
然后再稍作修改:
# 第一个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 0] = 0.2*(i+j) # 第一个通道值 # 第二个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 1] = 200*np.cos(i+j)+55*np.sin(j^i) # 第二个通道值 # 第三个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 2] = 255*np.tanh(i+j) # 第三个通道值
获得了类似木材的图像:
图6
继续修改获得了颜色稍多的图像:
# 第一个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 0] = 0.25*(i*j)+5*np.power(np.tanh(i+j),0.1*np.exp(i-j)) # 第一个通道值 # 第二个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 1] = 155*np.cos(i+j)+np.tanh(j)-0.25*(i-2*j)*(2*i+j)# 第二个通道值 # 第三个通道值 for i in range(0,t_max,1): for j in range(0,t_max,1): image[i, j, 2] = 10*np.power(np.exp(np.cos(100*(i+j))*np.sin(0.10*j))*i+j,0.005*((j-i))) # 第三个通道值 #print(np.max(image[i, j, 2]))
图7
【3】总结
掌握了使用python+opencv+numpy输出彩色图像的方法。