python - 用于掩盖图像中红色和蓝色通道的矢量化方法
问题描述
我正在尝试将图像中的所有红色和蓝色像素更改为黑色以仅具有绿色像素(基于某些条件)。
为了做到这一点,我现在使用了多个 for 循环,这个过程虽然有效,但速度非常慢。
到目前为止我的代码 -
### Test image is my original RGB image
mat = np.asarray(testim)
for elemento in mat:
for pixel in element:
if ((pixel[0] + pixel[2]) >= (2*pixel[1])): #Non-vegetation background changing to black according to the rule (R + B >= 2G)
pixel[0] = 0
pixel[1] = 0
pixel[2] = 0
elif pixel[1] > pixel[0] and pixel[1] > pixel[2] and pixel[1] > 25: # Treat these as green vegetation and do not change anything
continue
else: # Change background to black
pixel[0] = 0
pixel[1] = 0
pixel[2] = 0
cv2_imshow(testim)
print(testim.shape)
有什么方法可以使用Numpy对其进行矢量化,而无需使用嵌套的 for 循环来使相同的过程更快地工作?我对 NumPy 操作有点陌生,对如何完成它感到困惑。感谢您的帮助!
例如:我的输入图像 - [1]:https ://i.stack.imgur.com/zWGtA.jpg
我现在具有上述逻辑的输出图像 - [2]:https ://i.stack.imgur.com/VkmLC.jpg
我希望使用更快的代码获得相同的输出,最好使用 NumPy 而不是我目前拥有的嵌套 for 循环
解决方案
我将图像数组拆分为三个数组(r、g、b)以使规则更直观。使用这种格式添加任何新的应该很容易!
r, g, b = mat[:,:,0], mat[:,:,1], mat[:,:,2]
rule_1 = (r + b > 2 * g)
rule_2 = ~((g > r) & (g > b) & (g > 25))
mat[rule_1 | rule_2] = 0
推荐阅读
- python - 如何打印在读取熊猫数据框期间显示警告的文档名称
- wordpress - Woocommerce 感谢页面
- spring - 为什么 Spring 不能自动装配我的云流处理器?
- css - 如何在开发模式下在 webpack 中创建单独的 .css 文件?不是虚拟发出的,而是内置在项目目录中
- powershell - 将 XmlElement 对象转换为 PSCustomObject
- html - 下拉框中的下拉列表消失 Angular 5
- highcharts - 如何确保每个刻度都有标签?
- excel - 使用时间时 SUM 和 + 之间的差异
- c++ - 数组在每次递归时都会改变它们的值
- sql - 查询连接三个表并获取一个字段的计数不返回零值