gpt4 book ai didi

python - 第二种滤除非黑色像素方式的实现

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:40 27 4
gpt4 key购买 nike

所以我正在分析相机图像并想从中检索黑色字母。首先,我定义了所有 channel 的阈值并将其应用于图像,例如

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

然后,我通过使用

对图像进行阈值化,从中检索了一个掩码以供进一步使用

mask = cv2.inRange(图像,低,上)

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

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

非常感谢,这会有很大帮助!

最佳答案

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

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 channel 图像。

In [80]: np.random.seed(0)

In [81]: image = np.random.random(size=(4, 5, 3))

In [82]: np.set_printoptions(precision=2)

In [83]: np.rollaxis(image, 2, 0)
Out[83]:
array([[[ 0.55, 0.54, 0.44, 0.38, 0.57],
[ 0.09, 0.78, 0.8 , 0.12, 0.94],
[ 0.26, 0.57, 0.61, 0.68, 0.7 ],
[ 0.67, 0.32, 0.44, 0.21, 0.25]],

[[ 0.72, 0.42, 0.89, 0.79, 0.93],
[ 0.02, 0.87, 0.46, 0.64, 0.52],
[ 0.77, 0.02, 0.62, 0.36, 0.06],
[ 0.21, 0.36, 0.99, 0.16, 0.47]],

[[ 0.6 , 0.65, 0.96, 0.53, 0.07],
[ 0.83, 0.98, 0.78, 0.14, 0.41],
[ 0.46, 0.62, 0.94, 0.44, 0.67],
[ 0.13, 0.57, 0.1 , 0.65, 0.24]]])

阈值设置为 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)

关于python - 第二种滤除非黑色像素方式的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42855767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com