自学内容网 自学内容网

python学opencv|读取图像(十)用numpy创建彩色图像

【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。

28925b84a1fa4867a0aa0633010c7dce.png

图1

要想输出彩色图像,下一步就是更新通道颜色:

首先把第一个通道的值全部改成155(数据在[0,255]内随意填写):

image[:,:,0]=155 #第一个通道值

此时会输出一张纯蓝色图像,如图2:

54e121ca0e9a4108bc9ea00cc5fed86d.png

图2

然后继续,把第二个通道的颜色设置成200:

image[:,:,1]=200 #第二个通道值

此时出现了一张绿色图,如图3:

5aa519b448b84a2ea1514e235c02e406.png

图3

 然后继续,把第三个通道的颜色设置成255:

image[:,:,2]=255 #第三个通道值

此时获得一张褐色图,如图4:

47ddd6751ddc4ec7a7416fb63915e746.png

图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)  # 第三个通道值

运行后获得的图像为:

6da8de54c98549cb9bb567fb061c14c5.png

图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)  # 第三个通道值

获得了类似木材的图像:

29e83be7a59744ad878f05c2e57028d1.png

图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]))

1978b464850a40e6b0be7f26141c73d3.png 图7

【3】总结

掌握了使用python+opencv+numpy输出彩色图像的方法。

 

 

 


原文地址:https://blog.csdn.net/weixin_44855046/article/details/144426397

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!