gpt4 book ai didi

python - 对各个像素的 RGB 值迭代函数

转载 作者:行者123 更新时间:2023-12-01 05:18:47 24 4
gpt4 key购买 nike

我已经打开了图像并且可以访问各个像素的 RGB 值,但我现在要做的是将一个函数分别应用于每个像素的 RGB 值。也就是说,我不想以相同的方式将其应用到整个图像中的所有像素;我想以不同的方式应用它,具体取决于对于每个单独的像素,蓝色值是否>红色>绿色(而不是绿色>红色>蓝色,等等)。

所以我的问题是,如何访问每个像素内的各个 RGB 元素(而不是一次访问整个图像中的所有红色、绿色和蓝色值)?最终我的问题将是“最快的方法是什么?”因为单独在每个像素上应用一个函数显然需要一段时间,但现在我很高兴能有任何解决方案。

感谢您的任何建议。

编辑清楚/更具体:

我实际上正在尝试根据 127.5 - abs(127.5 - red/green/blue)) 的顺序应用一组不同的指令,而不仅仅是按照红色>绿色>蓝色的顺序(如上面最初所述, bc 我试图简化)。一旦确定了给定像素的顺序,就会应用适当的指令集。再说一遍,这是逐像素的——我不是根据图像中的所有红色值来排序,而是根据各个像素的 RGB 来排序。所以我想做的事情看起来像这样(这里我只执行六种可能的顺序之一;为简洁起见,我省略了其他五种可能性):

def rgb_manip(red,green,blue):
r_max = int(127.5 - abs(127.5 - red))
g_max = int(127.5 - abs(127.5 - green))
b_max = int(127.5 - abs(127.5 - blue))
if r_max >= g_max >= b_max:
if r_max >= g_max + b_max:
new_red = red + g_max + b_max
new_green = green - g_max
new_blue = blue - b_max
else:
new_red = red + r_max
new_green = green - r_max + b_max
new_blue = blue - b_max
# elif... And so on, with a different set of instructions for each of the 6 possibilities depending on the order of the r_max, g_max, b_max values (e.g., r_max >= b_max >= g_max or g_max >= r_max >= b_max, etc, etc)

最佳答案

如果将图像转换为数组,则可以访问一个像素的 RGB 值,或所有像素的 R、G 或 B 值之一:

from __future__ import division
import numpy as np
from PIL import Image

im = Image.open(imfile)
arr = np.asarray(im)

arr[..., 0] # All Red values
arr[..., 1] # All Green values
arr[..., 2] # All Blue values
arr[0, 0] # RGB for first corner pixel
arr[m, n] # RGB for pixel at [m, n]
arr[m, n, 0] # R value for pixel [m, n]
arr[m, n, c] # value for color c at pixel [m, n]

您可以使用argsort获得每个像素的排名,如下所示:

def transform(a, c=255/2):
return c - np.abs(c - a)

ranking = transform(arr).argsort(axis=-1)

沿着最后一个(颜色)轴从最小到最大值对标准值进行排序。因此,这给出了一个新数组,其中每个“颜色”数组不是 RGB 值,而是转换后的 R、B 和 G 值的排序(称它们为“R”、B”、G”),因此如果角点像素具有 G' > B' > R',则 ranking[0, 0] 将是 [0, 2, 1] 因为 R ' (0) 最小,其次是 B' (2),最后最大的是 G' (1)。

执行上述操作的优点是您有一个数组,该数组表示对哪个像素使用哪种方法。它最多可以有六个转换 channel 的顺序。我建议为每个订单定义一个单独的函数,如下所示。然后,在函数内只需做出一个决定(示例中的第二个嵌套 if/else),并且可以使用 np.where 来完成。它将一件事应用于数组中满足条件的部分,而将另一件事应用于其余部分。这仅适用于两个选项,但如果有多个选项(if/elif/else),其他技术也可以同样有效。

def bgr(a):
""" for when B' < G' < R'
"""
t = transform(a)
red, green, blue = a.transpose([2,0,1])
# same as: red, green, blue = a[..., 0], a[..., 1], a[..., 2]
r_max, g_max, b_max = t.transpose([2,0,1])
assert np.all((b_max <= g_max) & (g_max <= r_max)), "doesn't match rank"
condition = r_max >= g_max + b_max
new_red = np.where(condition, red + g_max + b_max, red + r_max)
new_green = np.where(condition, green - g_max, green - r_max + b_max)
new_blue = blue - b_max
return np.dstack([new_red, new_green, new_blue])

此函数仅适用于您的第一个 if 。我将为这六件事中的每件事创建一个新函数,并将它们填充到一个字典中,如下所示:

functions = {
(0, 1, 2) : rgb, # for R'<G'<B'
(0, 2, 1) : rbg, # for R'<B'<G'
#etc...
}

如果您的输出也有 RGB 值:

out = np.empty_like(arr)

然后循环遍历所有六个排名/功能:

for rank, func in functions.items():
mask = np.all(transform(arr).argsort(-1) == rank, -1)
out[mask] = func(arr[mask])

关于python - 对各个像素的 RGB 值迭代函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800049/

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