第二种滤除非黑像素方法的实现

2024-10-01 09:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在分析相机图像,想从中提取黑字。首先,我定义了所有通道的阈值并将其应用于图像,例如

low = [0, 0, 0]
up = [0.42, 0.42, 0.42]

然后,我检索了一个蒙版以供进一步使用,方法是用

掩码=cv2.inRange(图像,低,上)

直到我发现不同的光照条件让我遇到了问题。E、 g.如果图像更亮,我可以将阈值上限调整为0.65,这对我分析的所有案例中的黑白区分都足够了。但是:现在其他颜色也会出问题,因为更多的颜色在这个间隔内。我认为第二个条件将所有可能的值限制为灰色,即只允许每个像素的三个通道的值之间存在一定的差异。在

现在的问题是,我如何以一种平滑的方式实现第二个条件,这样带有[0.4, 0.6, 0.4]的像素将被踢出,而带有[0.6, 0.62, 0.57]的像素将保持不变(随机示例,我自己调整参数)?在不需要对整个图像进行及时迭代的情况下,将这两者结合起来的最平滑的方法是什么?在

多谢了,这会很有帮助的!在


Tags: 方法图像定义颜色阈值像素条件cv2
1条回答
网友
1楼 · 发布于 2024-10-01 09:21:09

通道的强度范围是沿轴2的最大和最小强度之间的差值。您可以利用NumPybroadcasting开发一个完全矢量化的解决方案:

import numpy as np

def in_range(rgb, rgb_min, rgb_max):
    masks = np.logical_and(rgb >= rgb_min, rgb <= rgb_max)
    return np.all(masks, axis=2)

def small_deviation(rgb, rgb_dev):
    return (np.max(rgb, axis=2) - np.min(rgb, axis=2)) < rgb_dev

演示

在下面的示例运行中,我使用随机生成的4行和5列的3通道映像。在

^{pr2}$

阈值设置为low = [.0, .0, .0]up = [.6, .5, 0.7]和{}。在

In [84]: low = [.0, .0, .0]

In [85]: up = [.6, .5, 0.7]

In [86]: mask1 = in_range(image, low, up)

In [87]: mask1
Out[87]: 
array([[False,  True, False, False, False],
       [False, False, False, False, False],
       [False,  True, False, False, False],
       [False,  True, False,  True,  True]], dtype=bool)

In [88]: dev = .4

In [89]: mask2 = small_deviation(image, dev)

In [90]: mask2
Out[90]: 
array([[ True,  True, False, False, False],
       [False,  True,  True, False, False],
       [False, False,  True,  True, False],
       [False,  True, False, False,  True]], dtype=bool)

In [91]: mask = np.logical_and(mask1, mask2)

In [92]: mask
Out[92]: 
array([[False,  True, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False,  True, False, False,  True]], dtype=bool)

相关问题 更多 >