Numpy查找与其他特定颜色的像素相邻的特定颜色的所有像素

iqxoj9l9  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(167)

我想找出图像中所有的灰色像素和黑色像素的左边。
要找到所有具有我要找的灰度的像素,我可以这样做:

np.where(np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1))

有没有一种方法可以将此语句与灰色像素旁边的像素必须是黑色的条件结合起来?即只返回紧靠黑色像素左边的灰色像素?
我可以做一个for循环,循环第一步中找到的所有灰色像素,然后检查它们旁边的像素是否是黑色的,但是这看起来效率很低,在numpy中有没有更有效的方法?

n3ipq98p

n3ipq98p1#

为了找到紧邻黑色像素左侧的灰色像素,我们可以应用以下阶段:

  • 使用True创建一个遮罩,其中像素为灰色,否则为False

与上面的代码相同,但没有np.where

gray_mask = np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1)
  • True创建一个遮罩,其中像素为黑色,否则为False
black_mask = np.all(img == 0, axis=-1)
  • 将黑色蒙版向左移动一列。

此阶段用于将黑色像素放置在我们希望找到的灰色像素的位置。
我们在蒙版的右侧大小添加一列False值(用于在裁剪后“校正”蒙版大小)。

shifted_black_mask = np.pad(black_mask[:, 1:], ((0, 0), (0, 1)), 'constant')
  • 在灰色蒙版和移动的黑色蒙版之间应用操作。
gray_next_to_black = gray_mask & shifted_black_mask
    # gray_next_to_black_idx = np.where(gray_next_to_black) # Get the indices if required

代码示例:

import cv2
import numpy as np

# Sample image for testing:
img = np.array([[[0, 100, 0], [0, 100, 0], [0, 100, 0], [0, 0, 0]],
                [[0, 100, 0], [80, 80, 80], [80, 80, 80], [0, 0, 0]],
                [[0, 100, 0], [80, 80, 80], [80, 80, 80], [0, 100, 0]],
                [[0, 100, 0], [80, 80, 80], [0, 0, 0], [0, 100, 0]]], np.uint8)

gray_mask = np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1)  # Create a mask with True where pixel is gray and False otherwise.
black_mask = np.all(img == 0, axis=-1)  # Create a mask with True where pixel is black and False otherwise.

# Shift the black mask one column to the left
shifted_black_mask = np.pad(black_mask[:, 1:], ((0, 0), (0, 1)), 'constant')  # Crop from the second column to the end, and add column of zeros at the right hand side.

# Apply and operation between the gray mask and the shifted black mask
# The result is True where gray pixel has a black pixel from it's right
gray_next_to_black = gray_mask & shifted_black_mask

# Get the indices if required:
# gray_next_to_black_idx = np.where(gray_next_to_black)

# Show image and masks for testing:
cv2.imshow("img", cv2.resize(img, (256, 256), interpolation=cv2.INTER_NEAREST))
cv2.imshow("gray_mask", cv2.resize(gray_mask.astype(np.uint8)*255, (256, 256), interpolation=cv2.INTER_NEAREST))
cv2.imshow("black_mask", cv2.resize(black_mask.astype(np.uint8)*255, (256, 256), interpolation=cv2.INTER_NEAREST))
cv2.imshow("shifted_black_mask", cv2.resize(shifted_black_mask.astype(np.uint8)*255, (256, 256), interpolation=cv2.INTER_NEAREST))
cv2.imshow("gray_next_to_black", cv2.resize(gray_next_to_black.astype(np.uint8)*255, (256, 256), interpolation=cv2.INTER_NEAREST))
cv2.waitKey()
cv2.destroyAllWindows()

img

gray_mask

black_mask

shifted_black_mask

gray_next_to_black

相关问题