【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】
文章目录
- 概要
- 读入图像
- 改变单个通道
- 黑白特效
- 颜色反转
- 将图像拆分成四个子部分
概要
Python是一种功能强大的编程语言,也是图像处理领域中常用的工具之一。通过使用Python的图像处理库(例如Pillow、OpenCV等),开发者可以实现各种各样的图像特效。这些特效包括但不限于:滤镜效果(如黑白、模糊、锐化等)、颜色转换、边缘检测、形状识别、图像合成和增强现实效果等。
在Python中,可以使用各种算法和技术来处理图像,例如卷积操作、颜色空间转换、形态学操作等。通过这些技术,开发者可以创建出令人惊叹的图像特效,用于美化照片、设计艺术作品、实现计算机视觉应用等。
图像处理的过程通常包括图像的读取、处理和保存。Python提供了简单而灵活的API,使得这些操作变得容易。开发者可以加载图像,对其进行各种操作,然后保存处理后的图像,以便后续使用或展示。
读入图像
# 导入Pillow库中的Image模块
from PIL import Image# 打开名为"landscape.jpg"的图像文件
img = Image.open('./landscape.jpg')# 获取图像的宽度和高度
width, height = img.size
print("图像宽度:", width, "图像高度:", height)# 遍历图像的每个像素点
for x in range(0, height):for y in range(0, width):# 获取当前像素点的红色(r)、绿色(g)、蓝色(b)通道的像素值(r, g, b) = img.getpixel((x, y))# 打印每个像素点的RGB值print("像素点 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
在以上代码片段中,我们使用了Python的Pillow库来进行图像处理。首先,我们打开了名为"landscape.jpg"的样例图像,并获取了图像的宽度和高度。接着,我们使用嵌套的循环遍历图像的所有像素点。在每个像素点,我们使用getpixel((x, y))方法获取了红色(r)、绿色(g)、蓝色(b)三个通道的像素值。
通过这个嵌套循环,我们可以逐个打印出图像中每个像素的RGB值,从而了解图像的构成。这种方式可以作为图像处理的基础,为后续的图像处理操作提供了基础数据。这样的操作使得我们能够更深入地了解图像,为后续的图像处理任务提供了必要的信息。
报错;
D:\anaconda\envs\yolov5\python.exe E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\guangliu\33.py
图像宽度: 938 图像高度: 613
Traceback (most recent call last):File "E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\guangliu\33.py", line 15, in <module>(r, g, b) = img.getpixel((x, y))
ValueError: too many values to unpack (expected 3)Process finished with exit code 1

解决办法一:
错误提示表明在(r, g, b) = img.getpixel((x, y))这一行代码中,getpixel((x, y))返回的值不是期望的3个像素通道值(红、绿、蓝),而是更多的值,因此Python无法将这些值正确地分配给(r, g, b)。这种情况通常发生在图像模式(mode)不是RGB模式的时候。
可以在处理图像之前,将图像转换为RGB模式。
# 将图像转换为RGB模式
img = img.convert('RGB')
修改代码为:
# 导入Pillow库中的Image模块
from PIL import Image# 打开名为"landscape.jpg"的图像文件
img = Image.open('img_1.png')# 将图像转换为RGB模式
img = img.convert('RGB')# 获取图像的宽度和高度
width, height = img.size
print("图像宽度:", width, "图像高度:", height)# 遍历图像的每个像素点
for x in range(0, height):for y in range(0, width):# 获取当前像素点的红色(r)、绿色(g)、蓝色(b)通道的像素值(r, g, b) = img.getpixel((x, y))# 打印每个像素点的RGB值print("像素点 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
结果:

解决办法二:
修改传递参数即可,
将三个传递参数添加第四个d即可解决问题。
(r, g, b,d) = img.getpixel((x, y))
完整代码
# 导入Pillow库中的Image模块
from PIL import Image# 打开名为"landscape.jpg"的图像文件
img = Image.open('img_1.png')# 获取图像的宽度和高度
width, height = img.size
print("图像宽度:", width, "图像高度:", height)# 遍历图像的每个像素点
for x in range(0, height):for y in range(0, width):# 获取当前像素点的红色(r)、绿色(g)、蓝色(b)通道的像素值(r, g, b,d) = img.getpixel((x, y))# 打印每个像素点的RGB值print("像素点 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
结果依旧

改变单个通道
首先使用Pillow库打开了名为"landscape.jpg"的图像文件。然后,我们获取了图像的宽度和高度,并创建了一个新的图像对象new_img,它具有相同的大小。接着,我们使用嵌套的循环遍历原始图像的每个像素点。
在每个像素点,我们使用img.getpixel((col, row))获取红、绿、蓝三个通道的像素值。然后,我们将原始图像的绿色通道的像素值增加了50,创建了一个新的颜色。这个新颜色包含了原始红色通道的值(r),绿色通道的值增加了50(g+50),和原始蓝色通道的值(b)。最后,我们使用new_img.putpixel((col, row), (r, g + 50, b))将修改后的像素值放入新图像对象中。
# 导入Pillow库中的Image模块
from PIL import Image# 打开名为"landscape.jpg"的图像文件
img = Image.open('img_1.png')# 获取图像的宽度和高度
width, height = img.size
print("原始图像宽度:", width, "图像高度:", height)# 创建一个新的RGB模式的图像对象,具有相同的大小
new_img = Image.new('RGB', (width, height))# 遍历原始图像的每个像素点
for row in range(0, height):for col in range(0, width):# 获取当前像素点的红色(r)、绿色(g)、蓝色(b)通道的像素值(r, g, b) = img.getpixel((col, row))# 修改绿色通道的像素值,增加50new_green = g + 50# 将修改后的像素值放入新图像对象中new_img.putpixel((col, row), (r, new_green, b))# 将修改后的图像保存为"landscape_edited.png"文件
new_img.save("landscape_edited1.png")# 打印提示信息
print("图像处理完成,并保存为landscape_edited.png")
报错依旧:

按照上述方法二选一即可解决报错问题,我用添加的方法二避免报错。
完整代码
# 导入Pillow库中的Image模块
from PIL import Image# 打开名为"landscape.jpg"的图像文件
img = Image.open('img_1.png')# 获取图像的宽度和高度
width, height = img.size
print("原始图像宽度:", width, "图像高度:", height)# 创建一个新的RGB模式的图像对象,具有相同的大小
new_img = Image.new('RGB', (width, height))# 遍历原始图像的每个像素点
for row in range(0, height):for col in range(0, width):# 获取当前像素点的红色(r)、绿色(g)、蓝色(b)通道的像素值(r, g, b,d) = img.getpixel((col, row))# 修改绿色通道的像素值,增加50new_green = g + 50# 将修改后的像素值放入新图像对象中new_img.putpixel((col, row), (r, new_green, b,d))# 将修改后的图像保存为"landscape_edited.png"文件
new_img.save("landscape_edited1.png")# 打印提示信息
print("图像处理完成,并保存为landscape_edited.png")
结果:

这里也放方法一的结果:

依然可以完成这样的结果。
黑白特效
为了实现基本的黑白特效,我们必须确保所有3个通道都具有相同的值。
让我们再次迭代每个像素,并计算三个通道像素值的平均值:
# 导入Pillow库中的Image模块
from PIL import Image# 打开图片文件
img = Image.open('img_1.png')
# 将图像转换为RGB模式
img = img.convert('RGB')
# 获取图片的宽度和高度
width, height = img.size# 输出图片的宽度和高度
print("原始图片大小:", width, height)# 创建一张新的RGB模式的图片,大小与原始图片相同
new_img = Image.new('RGB', (width, height))# 遍历原始图片的每个像素
for row in range(0, height):for col in range(0, width):# 获取当前像素点的RGB颜色值(r, g, b) = img.getpixel((col, row))# 计算RGB三个通道的平均值,将像素点转换为灰度avg = int((r + g + b) / 3)# 在新图片上设置当前像素点的颜色为灰度值,实现黑白效果new_img.putpixel((col, row), (avg, avg, avg))# 将处理后的黑白图片保存为'landscape_black_and_white.jpg'
new_img.save("landscape_black_and_white.jpg")# 输出处理后的图片保存成功的消息
print("黑白图片已保存为'landscape_black_and_white.jpg'")

颜色反转
看懂了上述代码,那么颜色反转的实现现在应该会很简单!
简单来说。我们的目标是将黑色像素(0,0,0)转换为白色像素(255,255,255)。
from PIL import Imageimg = Image.open('img_1.png')
# 将图像转换为RGB模式
img = img.convert('RGB')
width, height = img.size
print(width, height)new_img = Image.new('RGB', (width, height))
for row in range(0, height):for col in range(0, width):(r, g, b) = img.getpixel((col, row))inverted_pixel = (255 - r, 255-g, 255-b)new_img.putpixel((col, row), inverted_pixel)
new_img.save("landscape_edited.jpg")

将图像拆分成四个子部分
from PIL import Imageimg = Image.open('img_1.png')
# 将图像转换为RGB模式
img = img.convert('RGB')
width, height = img.size
print(width, height)new_img = Image.new('RGB', (width, height))for row in range(0, height):for col in range(0, width):(r, g, b) = img.getpixel((col, row))if col < width * 0.25:(r, g, b) = (r, g, b)elif col < width * 0.5:avg = int((r + g + b) / 3)(r, g, b) = (avg, avg, avg)elif col < width * 0.75:(r, g, b) = (r, g + 50, b)else:(r, g, b) = (255 - r, 255 - g, 255 - b)new_img.putpixel((col, row), (r, g, b))new_img.save("landscape_edited.jpg")

小结:
机器学习报错解决2——ValueError: too many values to unpack (expected 3)
这个文章里面的东西被参考,我用来做方法二,可以说有点用,但是方法一是最好的办法,避免方法二的传参问题,如果有参数传递错误,或者是版本问题导致库的传参问题,可以使用方法二
。
相关文章:
【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】
文章目录 概要读入图像改变单个通道黑白特效颜色反转将图像拆分成四个子部分 概要 Python是一种功能强大的编程语言,也是图像处理领域中常用的工具之一。通过使用Python的图像处理库(例如Pillow、OpenCV等),开发者可以实现各种各…...
875. 爱吃香蕉的珂珂
题目描述 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,…...
台灯太亮会导致近视吗?精选高品质的台灯
台灯相信很多家庭都会备上一台,用于办公、休闲或者给孩子学习使用,如果使用的台灯亮度过高的话,可能会对视力造成一定的影响,尤其是夜晚的时候。建议是选择带有亮度调节功能的台灯会比较好一点,可以自行根据周围环境的…...
Scala函数和闭包
1. 函数 1.1 函数与方法 Scala 中函数与方法的区别非常小,如果函数作为某个对象的成员,这样的函数被称为方法,否则就是一个正常的函数。 // 定义方法 def multi1(x:Int) {x * x} // 定义函数 val multi2 (x: Int) > {x * x}println(mult…...
LeetCode----1935. 可以输入的最大单词数
题目 键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。 给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入…...
学习笔记三十:K8S配置管理中心Secret实现加密数据配置管理
K8S配置管理中心Secret实现加密数据配置管理 Secret概述secret三种可选参数:Secret类型 使用Secret通过环境变量引入Secret通过volume挂载Secret创建Secret创建yaml文件将Secret挂载到Volume中 Secret概述 Configmap一般是用来存放明文数据的,如配置文件࿰…...
关于uviewui修改主题及在uniapp中的应用
在uview使用过程中遇到很多不方便的地方,记录下来 修改主题颜色 给UI框架换个主题色基础方法是覆盖原有色(但这个方法比较笨,处理起来也不干净利索),所以换个思路改变基础色值变量,步骤主要分为2部分&…...
使用QEMU模拟启动uboot
uboot的相关知识,可以参考:uboot基本概念。 一、环境配置 WSL: ubutu20.04 模拟开发板:vexpress-a9 uboot版本:u-boot-2023.10 二、安装QEMU 2.1、安装sudo apt install qemu2.2、查看支持哪些开发板qemu-system-arm -M help结…...
学习数据结构和算法之前,你需要知道什么?
最快的学习方法是什么?计算机基础支持有哪些?学习数据结构和算法应该如何思考?如何成长?为什么要学习数据结构和算法? 最快的学习方法是什么? 实践。 计算机基础支持有哪些? 数据结构和算法。…...
16. 机器学习 - 决策树
Hi,你好。我是茶桁。 在上一节课讲SVM之后,再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始,来看下面这张图: 假设我们的x1 ~ x4是特征,y是最终的决定,打比方说是…...
将多余的内存,当作虚拟内存。修改edge缓存路径到虚拟内存中
一、下载工具,把内存映射成硬盘 软媒内存盘 v1.1.3.0 软媒内存盘下载-软媒内存盘 v1.1.3.0 - 下载吧 (xiazaiba.com) 二、映射edge的缓存路径 到新建的虚拟硬盘中 mklink /D "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data" "V:\…...
【从0到1设计一个网关】过滤器链的实现---实现负载均衡过滤器
文章目录 什么是过滤器?编写负载均衡过滤器负载均衡的定义与实现负载均衡算法设计实现效果演示链接 自研网关整合Nacos,实现服务注册和配置变更 源码链接 什么是过滤器? 再前面的几个章节中我们已经实现了将我们的网关服务注册到注册中心,并且成功的从配置中心拉取了配置…...
科技云报道:打造生成式AI应用,什么才是关键?
科技云报道原创。 生成式AI作为当前人工智能的前沿领域,全球多家科技企业都在加大生成式AI的研发投入力度。 随着技术、产品及应用等方面不断推出重要成果,如今有更多的行业用户在思考该如何将生成式AI应用落地。 但开发生成式AI应用是一个充满挑战的…...
可回馈式电子负载的工作原理
可回馈式电子负载是一种用于模拟负载并测试电源或电子设备性能的工具。其工作原理如下: 控制回路:可回馈式电子负载内部有一个控制回路,用于监测和控制负载的电流、电压和功率等参数。这个控制回路可以根据用户设定的参数,自动调整…...
基于Vite使用VitePress搭建静态站点博客
使用VitePress搭建静态站点博客 官方文档什么是VitePress?一、初始化项目1.安装依赖包VitePress可以单独使用,也可以安装到现有的项目中。在这两种情况下,您都可以安装它: (也可以全局安装,建议:当前项目内安装) 2.初始…...
湖南互联网医院-让患者随时随地接受医疗服务
打造移动互联网医院,就是,通过移动互联网将医院与患者、医院内部(医生、护士、领导层)、医院与生态链上的各类组织机构连接起来。以患者为中心,优化医院业务流程,提升医疗服务质量与医院资源能效࿰…...
【建议收藏】免费体验的AI论文写作网站-「智元兔 AI」
在当今技术飞速发展的时代,越来越多的领域开始应用人工智能(Artificial Intelligence,简称AI)。其中,AI写作工具备受瞩目,备受推崇。 在众多的选择中,智元兔AI是一款在笔者使用过程中非常有帮助…...
CUDA编程
线程全局索引计算方式 一维网格和一维的线程块 计算方法:...
gorilla/websocket的chat示例代码简单分析
代码地址:https://github.com/gorilla/websocket/tree/main/examples/chat 文件包含:main.go、hub.go、client.go、home.html main.go文件 func main() {flag.Parse()hub : newHub() // 实例化Hubgo hub.run() // 使用chan处理 增删Hub的连接 和 广播消…...
地图坐标展示工具folium
参考:https://github.com/python-visualization/folium https://zhuanlan.zhihu.com/p/384078185?utm_id0 https://www.w3cschool.cn/article/37568875.html 其他还有baidu:echarts 安装: pip install folium代码(离线地图&a…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
