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

        # 修改绿色通道的像素值,增加50
        new_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))

        # 修改绿色通道的像素值,增加50
        new_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 Image

img = 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 Image

img = 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)
这个文章里面的东西被参考,我用来做方法二,可以说有点用,但是方法一是最好的办法,避免方法二的传参问题,如果有参数传递错误,或者是版本问题导致库的传参问题,可以使用方法二

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

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

相关文章

前端css介绍

CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 CSS语法 CSS实例 每个CSS样式由两个组成部分&#xff1a;选择器和…

matlab 计算Ax=b的解,解线性方程组的现成工具

只写了最简单的方式&#xff0c;其中b需要是列向量&#xff0c;用分号隔开元素&#xff1b; octave:7> A[1,2; 1.0001, 2;] A 1.0000 2.00001.0001 2.0000octave:8> b[3; 3.0001;] b 3.00003.0001octave:9> xA\b x 1.00001.0000octave:10> b-A*x ans 00octave:…

深入探究Vue.js生命周期及其应用场景

当谈到Vue.js的生命周期时&#xff0c;我们指的是组件在创建、更新和销毁过程中发生的一系列事件。了解Vue的生命周期对于开发人员来说是至关重要的&#xff0c;因为它们提供了一个机会来执行特定任务&#xff0c;并在不同的阶段处理组件。 Vue的生命周期可以分为八个不同的阶…

Tigger绕过激活锁/屏幕锁隐藏工具,支持登入iCloud有消息通知,支持iOS12.0-14.8.1。

绕过激活锁工具Tigger可以用来帮助因为忘记自己的ID或者密码而导致iPhone/iPad无法激活的工具来绕过自己的iPhone/iPad。工具支持Windows和Mac。 工具支持的功能&#xff1a; 1.Hello界面两网/三网/无基带/乱码绕过&#xff0c;可以完美重启&#xff0c;支持iCloud登录、有消…

关于服务端构件模型的典型解决方案

关于服务端构件模型的典型解决方案包括 适用于应用服务器的EJB模型&#xff08;Sun公司J2EE的一部分&#xff09;和COM模型&#xff08;微软公司&#xff09;&#xff0c; 以及适用于Web服务器的servlet模型&#xff08;基于Sun公司JSP技术&#xff09;和Visual Basic及其他技…

uniapp leven系列原生插件(1)

目录 1.乐橙摄像机播放插件(云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 2.乐橙摄像机播放插件(子账号云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 3.无预览静默拍照 插件介绍 插件地址 预览图片 4.视频图片选择安卓原生插件 插件介绍 插件地址 预览图…

RoCEv2网络部署----Mellanox网卡配置

Mellanox 网卡配置RoCEv2步骤&#xff0c; 1. 设置RDMA CM 模式v2 cma_roce_mode -d mlx5_1 -p 1 -m 2 检查RDMA CM的RoCE模式 2. 开启 DCQCN 在priority 3 echo 1 > /sys/class/net/ens1np0/ecn/roce_np/enable/3 echo 1 > /sys/class/net/ens1np0/ecn/roce_rp/enable…

天线测试解决方案-毫米波片上天线测量系统

毫米波片上天线测量系统 方案概述&#xff1a; 毫米波片上天线测量系统频率范围覆盖8GHz&#xff5e;110GHz&#xff08;可扩展至500GHz&#xff09;&#xff0c;具有频率覆盖范围宽、动态范围大、馈电形式灵活、结构紧凑、测试参数全面等特点。系统采用通用化、模块化设计思想…

生态扩展:Flink Doris Connector

生态扩展&#xff1a;Flink Doris Connector 官网地址&#xff1a; https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装&#xff1a; tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…

Modelsim 使用教程(2)——Basic Simulation

一、概述 在本文中&#xff0c;我们将介绍Modelsim基本的仿真流程&#xff0c;包括有&#xff1a; Create the Working Design Library&#xff08;创建工具库&#xff09; Compile the Design Units&#xff08;编译设计单元&#xff09; Optimize the Design&#xff08;优化…

arcgis将合并(组合)要素拆分的方法

1、打开一幅图&#xff0c;发现两块区域被连接成一块区域&#xff0c;如下&#xff1a; 2、在可编辑状态下&#xff0c;进行拆分&#xff0c;先选中待拆分要素&#xff0c;如下&#xff1a; 3、拆分后&#xff0c;如下&#xff1a;

C++初阶 类和对象(上)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

白银期货投资指南,轻松搞定白银投资

在今天的金融市场中&#xff0c;白银已成为备受瞩目的投资选择。不仅如此&#xff0c;白银还是避险资产的首选之一&#xff0c;兼具保值和增值的潜力。万洲金业将为您提供一份白银期货投资指南&#xff0c;让您轻松了解白银投资&#xff0c;助力在白银交易市场获得潜在收益。 …

mpp解码详解

解码器数据流接口 一. decode_put_packet 输入码流的形式&#xff1a;分帧与不分帧 MPP 的输入都是没有封装信息的裸码流&#xff0c;裸码流输入有两种形式&#xff1a; 不分帧 这种方式是已经按帧分段的数据&#xff0c;即每一包输入给 decode_put_packet 函数的 MppPacket 数…

Spring事务失效的几种情况及其解决方案

Spring事务失效的几种情况及其解决方案 方法权限修饰符不是public Transactional 使用的是 Spring AOP 实现的&#xff0c;而 Spring AOP 是通过动态代理实现的&#xff0c;而 Transactional 在生成代理时会判断&#xff0c;如果方法为非 public 修饰的方法&#xff0c;则不生…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议&#xff0c;邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子&#xff0c;可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

MongoDB——MongoDB删除系统自带的local数据库

一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令&#xff0c;进入命令行客户端 进入admin库&#xff0c;并登录&#xff0c;查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…

【论文笔记】Unifying Large Language Models and Knowledge Graphs:A Roadmap

&#xff08;后续更新完善&#xff09; 2. KG-ENHANCED LLMS 2.1 KG-enhanced LLM Pre-training 以往将KGs集成到大型语言模型的工作主要分为三个部分:1)将KGs集成到训练目标中&#xff0c;2)将KGs集成到LLM输入中&#xff0c;3)将KGs集成到附加的融合模块中。 2.1.1 Integr…

大语言模型(LLM)综述(五):使用大型语言模型的主要方法

A Survey of Large Language Models 前言6 UTILIZATION6.1 In-Context Learning6.1.1 提示公式6.1.2 演示设计6.1.3 底层机制 6.2 Chain-of-Thought Prompting6.2.1 CoT的上下文学习6.2.2 关于CoT的进一步讨论 6.3 Planning for Complex Task Solving6.3.1 整体架构6.3.2 计划生…