给定一个浮点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)