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输出彩色图像的方法。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程池(ThreadPoolExecutor)

目录 一、线程池 标准提供的线程池 ThreadPoolExecutor 自定义线程池 一、线程池 为什么要引入线程池? 这个原因我们需要追溯到线程,我们线程存在的意义在于,使用进程进行并发编程太重了,所以引入了线程,因为线程又称为 “轻…

hbase读写操作后hdfs内存占用太大的问题

hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…

【IntelliJ IDEA 集成工具】TalkX - AI编程助手

前言 在数字化时代,技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量,他们需要一个强大而专业的工具来辅助开发过程,而正是为了满足这一需求,TalkX 应运而生。 一、概述 1…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

React 第十六节 useCallback 使用详解注意事项

useCallback 概述 1、useCallback 是在React 中多次渲染缓存函数的 Hook,返回一个函数的 memoized的值; 2、如果多次传入的依赖项不变,那么多次定义的时候,返回的值是相同的,防止频繁触发更新; 3、多应用在 父组件为函…

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆),可以在浏览器和node.js、deno、e…

Windows系统VSCode 搭建ESP-IDF环境

VS Code,安装ESP-IDF插件 快捷键CTRLSHIFTP,弹出显示所有命令的窗口,选择ESP-IDF的欢迎 使用第一个选项,要选择一个ESP-IDF版本,选最新的就行 点击Install,等待下载 提示安装成功,如果过程中出现python已存…

PR裁剪与删除

剪切 剪切片段 工具面板的第四个工具,剃刀工具,在英文输入法下可以使用快捷键C来切换,或者直接使用CtrlK进行裁剪。 CtrlK:选中剪辑后会在指针处进行裁剪。 剃刀工具:在执行位置剪裁,包括连接在一起的素材…

基于物联网的 AI 智能送药车与自维护基站系统研究

一、引言 (一)研究背景 随着科技的飞速发展,物联网技术在各个领域都展现出了巨大的潜力。在医疗领域,物联网技术的应用为提高医疗服务的效率和质量带来了新的机遇。其中,基于物联网的 AI 智能送药车与自维护基站系统…

TÜLU 3: Pushing Frontiers inOpen Language Model Post-Training

模型:https://huggingface.co/allenai 技术报告:https://allenai.org/papers/tulu-3-report.pdf 数据集:https://huggingface.co/collections/allenai/tulu-3-datasets-673b8df14442393f7213f372 GitHub:https://github.com/al…

123213124

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级:系统分析师。 考试时间:11月9日。 总体感觉偏简单,但是知识点记得不牢,估计机会不大。 今日 12.11 ,成绩已出,每科总分 75分,全部45分以上为通过。 成绩总…

数据结构10——排序

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题: 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…

Envoy 服务发现原理大揭秘与核心要点概述

1 Envoy动态配置介绍 动态资源,是指由envoy通过xDS协议发现所需要的各项配置的机制,相关的配置信息保存 于称之为管理服务器(Management Server )的主机上,经由xDS API向外暴露;下面是一个 纯动态资源的基…

PYNQ - 自定义含 DPU 的 overlay 层(MPSoC)

目录 1. 简介 2. 通过脚本构建 2.1 准备工作 2.2 通过 Makefile 构建 2.3 Makefile 源码及解析 2.3.1 源码-中文注释 2.3.2 主要功能分析 2.3.3 vivado batch 模式 2.3.4 package_xo 命令 2.3.5 vitis v 命令 2.4 DPU 参数 2.4.1 Arch 选项卡 2.4.2 Advanced 选项…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型,结合了深度学习和声学技术,能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成,即使没有直接的训练数据,模型仍能生成相似风格的语音。用户可以通过微调模…

25.DDD数量关系

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗?领域对象之…

GB28181系列二:TS、PS格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、TS、PS简介 二、PES格式 三、TS格式 3.1 固定字段 3.2、调整域(Adaptation field) 3.3、第一个可选域(optional fields) 3.4、第二个可选域(optional fields) 3.5、负载 3.6、PSI 四、PS格式 4.1、PS头…

OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

QT 国际化(翻译)

QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。…