记录一次将数组转为图像的操作 2021-02-28

本文介绍了如何使用Python将数组转换为灰度图像和彩色图像的方法。通过numpy生成特定数值的数组,并利用PIL库的Image.fromarray函数将其转换为图像文件。示例中详细展示了创建灰度图像和三通道彩色图像的具体步骤。

记录一次将数组转为图像的操作

将自己生成的数组转为图像的操作方式,记录一下,其中Image.formarray()的用法只说明两种,具体可查寻函数介绍

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

# 数组转成灰度图像
img = np.zeros((512, 512))
for x in range(300):
    for y in range(512):
        img[x, y] = 180
img1 = Image.fromarray(np.uint8(img), 'L')  # “L”表示灰度图像,每个像素用8位表示
img1.save('./' + 'fsof' '.png')
# plt.imshow(img1)

# 三通道数组转成彩色图像
img2 = np.zeros((512, 512, 3))
for x in range(300):
    for y in range(512):
        img2[x, y, :0] = 230
for x in range(300):
    for y in range(512):
        img2[x, y, :1] = 80
for x in range(300):
    for y in range(512):
        img2[x, y, :2] = 150
img2 = Image.fromarray(np.uint8(img2), 'RGB')  # 八位表示的彩色图像
img2.save('RGBimg' + '.png')

fsof.png在这里插入图片描述
RGBimg在这里插入图片描述

有一个方法,在最后返回调用这个 find_arr(self,im1, im2, similar=1, density=None, rect=None, debug=False)方法,但是前两位参数background_arr=background_arr, target_arr=target_arr置灰提示Unexpected argument ,方法如下: def quick_find(self,fp1: str, fp2: str,similar: float = 1,density: float = None,rect: tuple = None,loc: str = "all", debug: bool = False) -> any: """在背景图像中搜索目标图像的位置(核心功能:图像匹配)""" # -------------------- 调试模式初始化(可选计时) -------------------- if debug: # from time import time # 示例计时工具(可替换为自定义TS) # start_time = time() # 记录开始时间 print(f"此处废弃调试计时") # -------------------- 步骤1:加载背景图和目标图 -------------------- background_img = Image.open(fp1) # 加载背景图(待搜索的大图) target_img = Image.open(fp2) # 加载目标图(需要查找的小图) # -------------------- 步骤2:确定搜索区域 -------------------- bg_width, bg_height = background_img.size # 获取背景图尺寸(宽度, 高度) # 若未手动指定搜索区域rect,则根据loc自动计算默认区域(调用get_rect) if rect is None: rect = self.get_rect( width=bg_width, height=bg_height, loc=loc) # -------------------- 步骤3:预处理图像数组 -------------------- # 注:img2arr可能是将PIL图像转为numpy数组的工具函数(需自定义实现) if rect: cropped_bg = background_img.crop(rect) else: cropped_bg = background_img background_arr = self.img2arr(cropped_bg) # 背景图数组 target_arr = self.img2arr(target_img) # 目标图数组 # -------------------- 调试模式:输出预处理耗时 -------------------- if debug: print(f"此处废弃调试计时") # -------------------- 步骤4:执行图像匹配 -------------------- # 调用核心匹配函数(假设find_arr是自定义匹配函数,需自行实现) return self.find_arr( background_arr=background_arr, target_arr=target_arr, similar=similar, density=density, rect=rect, debug=debug )
最新发布
07-19
<think>好的,我现在需要解决用户的问题。用户提到在调用`find_arr`方法时,前两个参数`background_arr=background_arr`和`target_arr=target_arr`出现了“Unexpected argument”的提示。首先,我需要分析可能的原因。 首先,查看`find_arr`的定义。用户提供的`find_arr`方法的参数列表是`def find_arr ( im1 , im2 , similar = 1 , density = None , rect = None , debug = False )`。这说明`find_arr`的前两个位置参数是`im1`和`im2`,没有命名为`background_arr`或`target_arr`的参数。 用户在调用时使用了关键字参数`background_arr=background_arr`和`target_arr=target_arr`,但`find_arr`的参数名是`im1`和`im2`,所以这会导致Python识别到未定义的关键字参数,从而报错“Unexpected argument”。 解决方案应该是将调用时的参数名改为`im1`和`im2`,或者调整`find_arr`的参数名以匹配。但根据用户提供的代码,`find_arr`的参数名是固定的,所以正确的做法是将调用中的`background_arr`和`target_arr`对应到`im1`和`im2`。 具体来说,用户的`quick_find`方法中调用`self.find_arr`时,应该将`background_arr`作为`im1`传入,`target_arr`作为`im2`传入。因此,正确的调用应该是`self.find_arr(im1=background_arr, im2=target_arr, ...)`或者直接位置参数`self.find_arr(background_arr, target_arr, ...)`。 另外,需要检查`find_arr`是否是类的方法,是否有`self`参数。用户提供的`find_arr`定义中没有`self`,但`quick_find`是类方法,调用`self.find_arr`说明`find_arr`应该是该类的一个实例方法,可能用户之前的定义中遗漏了`self`参数。如果`find_arr`确实是实例方法,那么它的第一个参数应该是`self`,此时`im1`是第二个参数,`im2`是第三个参数,这会导致参数位置错误。需要确认`find_arr`的参数列表是否正确包含`self`。 假设`find_arr`是实例方法,正确的参数列表应该是`def find_arr(self, im1, im2, similar=1, density=None, rect=None, debug=False)`,那么用户调用时`self.find_arr(background_arr, target_arr, ...)`就会正确传递参数。如果原`find_arr`定义中没有`self`,则需要添加,否则调用时会因为缺少实例参数而报错。 总结问题:用户调用`find_arr`时使用了错误的关键字参数名(`background_arr`和`target_arr`),而`find_arr`的参数名是`im1`和`im2`,导致“Unexpected argument”错误。需要将调用中的参数名改为`im1`和`im2`,或者调整参数传递方式为位置参数。 </think>你遇到的`Unexpected argument`错误是由于调用`find_arr`时使用了错误的参数名导致的。根据你提供的代码: ### 问题根源分析 `find_arr`方法的定义是: ```python def find_arr(im1, im2, similar=1, density=None, rect=None, debug=False) ``` 这说明它的前两个**位置参数**是`im1`(主图数组)和`im2`(模板图数组),**没有名为`background_arr`或`target_arr`的参数**。 但你在调用时写的是: ```python return self.find_arr(background_arr=background_arr, target_arr=target_arr, ...) ``` 这里错误地使用了`background_arr`和`target_arr`作为关键字参数名,而`find_arr`根本不认识这两个参数名,因此报`Unexpected argument`(意外参数)。 ### 修复方案 将调用时的参数名改为`find_arr`实际定义的参数名: - 用`im1`代替`background_arr`(主图数组对应`im1`) - 用`im2`代替`target_arr`(模板图数组对应`im2`) 修改后调用代码应为: ```python return self.find_arr( im1=background_arr, # 主图数组传给im1 im2=target_arr, # 模板图数组传给im2 similar=similar, density=density, rect=rect, debug=debug ) ``` 或直接使用位置参数(更简洁): ```python return self.find_arr(background_arr, target_arr, similar, density, rect, debug) ``` ### 补充说明(常见误区) 如果`find_arr`是类的实例方法(即属于当前类的方法),需要确保它的定义中包含`self`作为第一个参数。例如: ```python # 正确的实例方法定义(包含self) def find_arr(self, im1, im2, similar=1, density=None, rect=None, debug=False): ... ``` 如果原`find_arr`定义中没有`self`,会导致调用时因缺少实例参数而报错(如`TypeError: find_arr() missing 1 required positional argument: 'im1'`),这需要同步修正`find_arr`的定义。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值