正如你所知,循环遍历每个像素并使用opencv访问它们的值需要太长的时间。作为一个初学者,我自己也在尝试学习opencv,当我尝试这种方法时,我花了大约7-10秒的时间来循环遍历图像并执行操作。
代码如下
original_image = cv2.imread(img_f)
image = np.array(original_image)
for y in range(image.shape[0]):
for x in range(image.shape[1]):
# remove grey background
if 150 <= image[y, x, 0] <= 180 and \
150 <= image[y, x, 1] <= 180 and \
150 <= image[y, x, 2] <= 180:
image[y, x, 0] = 0
image[y, x, 1] = 0
image[y, x, 2] = 0
# remove green dashes
if image[y, x, 0] == 0 and \
image[y, x, 1] == 169 and \
image[y, x, 2] == 0:
image[y, x, 0] = 0
image[y, x, 1] = 0
image[y, x, 2] = 0
在上面的代码中,我只是想删除灰色和绿色像素颜色。
我发现类似的问题问here,但我不能理解如何在我的用例中使用numpy,因为我是python和numpy的初学者。
任何帮助或建议,以解决这一点将不胜感激,谢谢
3条答案
按热度按时间nnsrf1az1#
您可以利用NumPy的矢量化操作来消除所有循环,这应该会快得多。
np.where
的两个调用都依赖于NumPy的broadcasting。nzrxty8p2#
提高代码性能的一种方法是使用
cv2.inRange()
函数查找具有所需颜色的像素,然后使用cv2.bitwise_and()
函数从图像中删除这些像素。这样做比逐个遍历每个像素效率更高,因为逐个遍历每个像素可能会很慢,而且计算量很大。下面是一个实现方法的示例:xsuvu9jc3#
您可以对图像应用numpy过滤。在您的方案中,它将是:
这里的
mask_gray
和mask_green
是布尔掩码