【问题标题】:Overwriting Pixels in numpy array覆盖numpy数组中的像素
【发布时间】:2019-10-05 19:45:28
【问题描述】:

我有一张图像,我试图用一些任意颜色(比如说蓝色)替换像素。我怎样才能用数组做到这一点。例如我的图片是:

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

我想更改第 3、2、3、4、3 列的颜色,以便我的图像变成类似

a b c * e
f g * i j
k l m * o
p q r s *
u v w * y

其中 * 是用蓝色替换的像素。怎么可能做到这一点?

【问题讨论】:

  • X[0,3] = blue

标签: python numpy image-processing


【解决方案1】:

由于您没有指定任何限制,我认为任何工具都可以,所以我建议使用Pillow。 (使用pip install Pillow 安装)

假设您的图像被命名为image.png,那么您可以遍历要编辑的像素并将每个位置的颜色设置为所需的颜色。

from PIL import Image

replacement_color = (0, 0, 255)
columns = [3, 2, 3, 4, 3]
positions = [(x, y) for y, x in enumerate(columns)]

image = Image.open('image.png')
pixels = image.load()

for (x, y) in positions:
    pixels[x, y] = replacement_color

image.show() # or image.save('transformed_image.png')

请注意,这种访问和编辑单个像素的方法可能会非常缓慢。


编辑:

使用布尔 numpy 数组作为掩码来识别您也可以使用的正确像素

import numpy as np
from PIL import Image

image = Image.open('image.png')
image_array = np.array(image)

# Just an example mask
diagonal = np.eye(image_array.shape[0], image_array.shape[1])
mask = diagonal == 1

image_array[mask] = [0, 0, 255, 0] # RGBA

altered_image = Image.fromarray(image_array)
altered_image.save('altered_image.png')

(改编自this guide

我不确定,但性能是否更好。

【讨论】:

  • 感谢您的澄清。我应该澄清一下我正在尝试使用 numpy 数组来实现它。我能够创建一个布尔掩码,基本上将这些像素标记为 False 并删除它们以重塑数组,但对于我的生活,我似乎无法弄清楚如何将像素的值更改为某种颜色。
  • @MrJonesIsCountingCrows 你为什么说你正在重塑数组?开始时是 5x5,之后是 5x5!
  • 我正在学习接缝雕刻,所以最后我需要缩小图像,所以我正在重塑阵列。因此,每次移除垂直接缝后,图像的每一行都会缩小一个像素。我可以很好地雕刻。但在雕刻之前,我还想可视化我要移除的接缝,因此,我想给像素着色以直观地看到它
  • 我想我是使用@BurningKarl 建议的迭代方法计算出来的。计算时间很长,但我以后会担心性能
猜你喜欢
  • 2021-04-17
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2020-06-07
相关资源
最近更新 更多