opencv 如何筛选矩阵元素?

5gfr0r5j  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(166)

我想从一个图像中得到一些不等于指定值的像素值。但是我想以RGB格式而不是以长矢量的形式得到。我该怎么做呢?

import cv2
import numpy as np

image = cv2.imread('image.jpg')
sought = [36,255,12]
result = image[image!=sought]

import sys
np.set_printoptions(threshold=sys.maxsize)
print(result)

我得到了:

[20 103  75  21  98  70  16 100  72  18 101  73  19  97  69  15  95  66
  15  95  67  13 101  73  19 104  77  21  96  69  13  94  65   8  99  69
  14  98  68  13  94  63  10  88  66  24  92  69  24  92  67  23  93  67
  13  93  67  13  93  67  13  97  72  16  96  70  16  93  66  15  96  68
  .....
  99  69  14  96  66  11  91  67  25  88  65  20  92  68  14  96  69  18
  96  70  16  91  64  13  95  67  13  92  64  10  90  63]

但我想要这样的东西:

[[[R,G,B], [R,G,B], [R,G,B], [R,G,B]],
       ......
      [[R,G,B], [R,G,B], [R,G,B], [R,G,B]]]

我错过了什么?

w6lpcovy

w6lpcovy1#

如果所需的输出是像素列表,则在按分量进行比较之后,您必须检查在具有.any(axis = 2)的R、G或B中的任何一个上哪些像素不同:

image[(image != sought).any(axis=2)]

输出形式:

array([[ 22, 136, 161],
       [197, 141, 153],
       [173, 122,  65],
       [137, 189,  67],
             ...
       [166, 205, 238],
       [207,  99, 129],
       [ 44,  76,  97]])
weylhg0b

weylhg0b2#

使用result = image[image != sought]时,您会丢失image的形状。解决方法是获取一个遮罩(image != sought),然后使用该遮罩处理图像(例如,使用np.where
生成一些数据:

import numpy as np

H, W, C = 8, 8, 3
sought = [255, 0, 0]
colors = np.array(
    [sought, [0, 0, 255], [0, 255, 0], [0, 255, 255], [255, 0, 255], [255, 255, 0]]
)
colors_idxs = np.random.choice(np.arange(len(colors)), size=(H, W))
image = colors[colors_idxs]

计算掩码(注意keepdims=True对于np.where工作起来更容易):

mask = np.any(image != sought, axis=-1, keepdims=True)

# Get color back into the mask
mask_inpaint_pos = np.where(mask, image, 0)
mask_inpaint_neg = np.where(mask, 0, image)

情节:

import matplotlib.pyplot as plt

fig, (ax_im, ax_mask, ax_mask_pos, ax_mask_neg) = plt.subplots(ncols=4, sharey=True)

ax_im.set_title("Original")
ax_im.imshow(image)

ax_mask.set_title("Mask binary")
ax_mask.imshow(mask.astype(int), cmap="gray")

ax_mask_pos.set_title("Mask True RGB")
ax_mask_pos.imshow(mask_inpaint_pos)

ax_mask_neg.set_title("Mask False RGB")
ax_mask_neg.imshow(mask_inpaint_neg)

plt.show()

相关问题