首页 > 解决方案 > np.ones 更改为元组,并且 np.asarray 没有修复它

问题描述

我正在制作一个使用 OpenCV 3.6 从图像中屏蔽文本的函数,并且在我的masked数组中使用时出现错误,我的数组被转换为元组function

我的脚本看起来像这样,我删除了获得坐标的部分。在 for 循环中,我想从原始图像中屏蔽文本。

import cv2
import numpy as np

results = [(200, 200, 300, 300), (600, 500, 1000, 900)]

def function(image, *mask):
   for(x1, y1, x2, y2) in results:
      mask[y1:y2, x1:x2] = image[y1:y2, x1:x2]
   return mask

image = cv2.imread('black.png')
masked = np.ones(image.shape, dtype=np.uint8) * 255
maskedText = function(image, masked)

cv2.imwrite("maskedText.png",maskedText)

我的蒙面数组看起来很正常,如下所示:

[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]]

但是当我在其中使用mask它时,function它是一个元组,因此在使用原始图像进行遮罩时它不起作用并且当我打印时它看起来像这样:

(array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8),)

np.asarray()没有修复它,它只是保持原样,我不断收到错误:

mask[y1:y2, x1:x2] = orig[y1:y2, x1:x2] TypeError: 'tuple' object does not support item assignment

我不知道它为什么会这样,我也找不到解决它的方法。

标签: pythonnumpyopencv

解决方案


在您的函数定义中,您有

def function(image, *mask):

具体来说,您已将其定义 *mask为参数。*参数前面的实际上mask是 python 的特殊语法,这意味着您可以将可变数量的参数传递给您的函数。

该函数将所有这些参数包装到一个名为的元组mask中 - 这就是您出错的原因。

欲了解更多信息,请阅读此处

要修复,只需执行

def function(image, mask):

推荐阅读