gpt4 book ai didi

python - 使用数组掩码更改像素值

转载 作者:行者123 更新时间:2023-11-28 22:44:14 28 4
gpt4 key购买 nike

描述

我有一张图片及其 mask 。我正在使用 PIL 和 Numpy 来应用以下规则:

  • mask 为红色的像素(255, 0, 0),设置为(0, 0, 0)
  • mask为绿色的像素(0, 255, 0),设置为(64, 64, 64)
  • mask为蓝色的像素(0, 0, 255),设置为(128, 128, 128)
  • mask为黄色的像素(255, 255, 0),设置为(255, 255, 255)
  • 否则,保持像素不变。

我尝试过的

使用数组掩码的想法,我尝试了以下方法:

import numpy as np
import Image

# (R G B)
red = [255, 0, 0]
green = [0, 255, 0]
blue = [0, 0, 255]
yellow = [255, 255, 0]


def execute():
im = Image.open('input.png')
data = np.array(im)
print "Original = ", data.shape

mask = Image.open('mask2.png')
data_mask = np.array(mask)
print "Mask = ", data_mask.shape

red_mask = data_mask == red
green_mask = data_mask == green
blue_mask = data_mask == blue
yellow_mask = data_mask == yellow

data[red_mask] = [0, 0, 0]
data[green_mask] = [64, 64, 64]
data[blue_mask] = [128, 128, 128]
data[yellow_mask] = [255, 255, 255]

im = Image.fromarray(data)
im.save('output.png')


if __name__ == "__main__":
execute()

问题

上面的代码输出:

Original =  (64, 64, 3)
Mask = (64, 64, 3)
ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 5012 output values where the mask is true

我错过了什么吗?如何使用数组掩码的想法来更改像素值?

最佳答案

看看 data[data_mask == red]:它将是一个平面数组,而不是 (X,Y,3) 的 3D 数组。所以,最后一个轴是 5012,而不是 3。所以你不能广播分配。

The docs解释一下:

The result is a 1-D array containing all the elements in the indexed array corresponding to all the true elements in the boolean array.

但是……

The result will be multidimensional if y has more dimensions than b. For example:

(这里,y 相当于您的datab 相当于您的red_mask。)

如果你仔细想想,这是有道理的。您的 red_mask 是一个 64x64x3 数组;它不可能挑选出 3 向量(像素),它只能挑选出单个值。


让我们举一个更小、更简单、具体的例子(一个 4 像素的一维数组,而不是一个 64x64 像素的二维数组),而不是你的例子,其中 (a) 你没有给我们数据和 (b ) 太大了,一次看不完:

>>> data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
>>> mask = np.array([[1,2,3], [4,5,6], [1,2,3], [4,5,6]])
>>> red = np.array([1,2,3])
>>> red_mask = mask == red
>>> red_mask
array([[ True, True, True],
[False, False, False],
[ True, True, True],
[False, False, False]], dtype=bool)
>>> data[red_mask]
array([1, 2, 3, 7, 8, 9])
>>> data[red_mask] = [0,0,0]
ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 6 output values where the mask is true
>>> red_mask[:,0]
array([ True, False, True, False], dtype=bool)
>>> data[red_mask[:,0]]
array([[1, 2, 3],
[7, 8, 9]])
>>> data[red_mask[:,0]] = [0,0,0]
>>> data
array([[ 0, 0, 0],
[ 4, 5, 6],
[ 0, 0, 0],
[10, 11, 12]])

看看 red_mask 是每个单独标量分量的索引,而 red_mask[:,0] 是每个整个 3 向量像素的索引?

关于python - 使用数组掩码更改像素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738854/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com