获取图像中的独特像素
Get unique pixels in image
以下:
image = cv2.imread("image.png")
print(image.shape)
print(np.unique(image,axis=1))
如果给予:
(700, 500, 3)
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
...
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]]
如何获得唯一像素?例如,[255 255 255] 应该是唯一像素值之一。
根据评论,其中一种方法是 np.unique(image.reshape(-1,3), axis=0)
但这可以通过 numba
降维来显着改善
import numpy as np
from numba import njit, prange
@njit(parallel=True)
def _numba_dot(arr, dimshape, len_arr, len_dimshape, su):
for i in prange(len_arr):
for j in range(len_dimshape):
su[i] = su[i] + arr[i][j] * dimshape[j]
def numba_dimreduce(arr, dtype=int):
dimshape = np.array([1, 256, 65536])
su = np.zeros(len(arr), dtype=dtype)
_numba_dot(arr, dimshape, len(arr), len(dimshape), su)
return su
>>> image = np.array([[[255, 255, 255], [255, 254, 254]], [[255, 254, 254], [254, 254, 254]]])
>>> img = image.reshape(-1, 3))
>>> img
array([[255, 255, 255],
[255, 254, 254],
[255, 254, 254],
[254, 254, 254]])
>>> u, idx = np.unique(numba_dimreduce(img), return_index=True)
>>> img[idx]
array([[254, 254, 254],
[255, 254, 254],
[255, 255, 255]])
如果您有大图像,您可能想尝试 np.bincount
类似的方法来进一步加快速度。
以下:
image = cv2.imread("image.png")
print(image.shape)
print(np.unique(image,axis=1))
如果给予:
(700, 500, 3)
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
...
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]]
如何获得唯一像素?例如,[255 255 255] 应该是唯一像素值之一。
根据评论,其中一种方法是 np.unique(image.reshape(-1,3), axis=0)
但这可以通过 numba
import numpy as np
from numba import njit, prange
@njit(parallel=True)
def _numba_dot(arr, dimshape, len_arr, len_dimshape, su):
for i in prange(len_arr):
for j in range(len_dimshape):
su[i] = su[i] + arr[i][j] * dimshape[j]
def numba_dimreduce(arr, dtype=int):
dimshape = np.array([1, 256, 65536])
su = np.zeros(len(arr), dtype=dtype)
_numba_dot(arr, dimshape, len(arr), len(dimshape), su)
return su
>>> image = np.array([[[255, 255, 255], [255, 254, 254]], [[255, 254, 254], [254, 254, 254]]])
>>> img = image.reshape(-1, 3))
>>> img
array([[255, 255, 255],
[255, 254, 254],
[255, 254, 254],
[254, 254, 254]])
>>> u, idx = np.unique(numba_dimreduce(img), return_index=True)
>>> img[idx]
array([[254, 254, 254],
[255, 254, 254],
[255, 255, 255]])
如果您有大图像,您可能想尝试 np.bincount
类似的方法来进一步加快速度。