Numpy:正确剪辑RGB颜色的最快方法



给定一个浮点RGB像素的3D数组,尺寸为X, Y, RGB。

rgb = array([[[ 1.11204494,  0.17241406,  0.14145795],
[ 0.98240261,  0.16112416,  0.11333147]],
[[ 0.1320549 ,  0.11862232,  0.16630839],
[ 0.10424024,  1.12368929,  0.15233576]]])

像素0和3超过了1.0的限制。正确的裁剪方法是将整个像素设置为[1.0,1.0,1,0]。

rgb = array([[[ 1.0       ,  1.0,         1.0],
[ 0.98240261,  0.16112416,  0.11333147]],
[[ 0.1320549,  0.11862232,  0.16630839],
[ 1.0,        1.0       ,  1.0]]])

我的方法很直接:

x,y,c = np.where(rgb > 1.0)
rgb[x, y, :] = 1.0

有没有更快的方法?

感谢您的帮助

干杯Volker

看来np.any()的想法并没有多大帮助。我还尝试了OpenCV使用cv2.inRange(),但无济于事。

我猜你的图像大小为1080p(但你可以插入任何大小),我猜大约10%的像素可能需要剪切(通过设置随机值的范围),并尝试了一些选项如下:

#!/usr/bin/env python3
import numba
import numpy as np
from numba import jit, prange
def method1(rgb):
# Original method
x,y,c = np.where(rgb > 1.0)
rgb[x, y, :] = 1.0
return rgb
def method2(rgb):
# np.any(axis=2) method
rgb[np.any(rgb>1,axis=2)]=1.0
return rgb
@jit(nopython=True,parallel=True)
def method3(rgb):
# Numba
h, w = rgb.shape[:2]
for y in prange(h):
for x in range(w):
p = rgb[y,x]
if p[0]>1.0 or p[1]>1.0 or p[2]>1.0:
rgb[y,x] = [1.0,1.0,1.0]
return rgb

# Create standard image
X, Y = 1920, 1080
np.random.seed(42)
rgb = np.random.uniform(high=1.1,size=(Y,X,3))
res = method1(rgb)
#res = method2(rgb)
#res = method3(rgb)

My timings showNumba以8-9倍的优势胜出:

In [58]: %timeit res = method1(rgb)
16.6 ms ± 129 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [59]: %timeit res = method2(rgb)
24.8 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [60]: %timeit res = method3(rgb)
1.93 ms ± 21.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关内容

最新更新