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

Python 第二种滤除非黑像素方法的实现,python,numpy,image-processing,computer-vision,rgb,Python,Numpy,Image Processing,Computer Vision,Rgb,所以我在分析相机图像,想从中提取黑色字母。首先,我为所有通道定义了阈值,并将其应用于图像,例如 low = [0, 0, 0] up = [0.42, 0.42, 0.42] 然后,我检索了一个面具,通过使用 遮罩=cv2.inRange(图像,低,向上) 直到我发现不同的光照条件让我遇到了问题,这才奏效。例如,如果图像更亮,我可以将上限阈值调整为0.65,这足以在我分析的所有情况下区分黑白。但是:现在其他颜色会产生问题,因为更多的颜色在这个间隔内。我认为第二个条件将所有可能的值限制为灰色会起

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

low = [0, 0, 0]
up = [0.42, 0.42, 0.42]
然后,我检索了一个面具,通过使用

遮罩=cv2.inRange(图像,低,向上)

直到我发现不同的光照条件让我遇到了问题,这才奏效。例如,如果图像更亮,我可以将上限阈值调整为
0.65
,这足以在我分析的所有情况下区分黑白。但是:现在其他颜色会产生问题,因为更多的颜色在这个间隔内。我认为第二个条件将所有可能的值限制为灰色会起作用,即,只允许每个像素的三个通道的值之间存在一定的差异

现在的问题是,我如何能够以平滑的方式实现第二个条件,以便将具有
[0.4,0.6,0.4]
的像素踢出,而具有
[0.6,0.62,0.57]
的像素保留(随机示例,我会自己调整参数)?将这两种方法结合起来,而不需要在整个图像上进行及时迭代的最平滑的方法是什么


非常感谢,这会很有帮助的

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

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
阈值设置为
low=[.0,0,0]
up=[.6,5,0.7]
dev=.4

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)

我不完全清楚你想要实现什么。你能举个例子吗(例如一个3x3“图像”作为输入和预期输出)。你最好转换成HSL或YUV colorspsce,在那里你有一个更简单的灰度度量。最后,我想得到一个所有“或多或少的灰度”像素都为真的遮罩,然后设置阈值。由于图像中的黑色可能具有值[0.4,0.38,0.41],并且颜色在其中一个通道中具有更高的偏差(例如[0.4,0.58,0.41]),因此我需要第二个条件,即不允许每个像素的通道之间存在超过一定差异。我会查看上面提到的渠道,但仍然希望有一个具体的解决方案。现在清楚一点了吗?谢谢你的回答,这正是我想要的!但我可以投票给你,少了2个代表;)
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)