python - 如何加快查找哪个图像像素颜色不在给定颜色列表中
问题描述
目的:我想加快查找哪个图像像素值不包含给定 RGB 颜色表中的一种颜色并将它们映射到另一个带_mistakes.png
后缀的图像的过程。
考虑到图像的大尺寸,使用两个 for 循环单独处理每个像素需要很长时间。
import glob
import numpy as np
import os
import cv2
import os.path
# the given list of defined RGB colors.
CLASSES = {
0: [0, 0, 0],
1:[255, 0, 0],
2:[0, 0, 255],
3:[0, 255, 0],
4:[50, 255, 50],
5:[100, 255, 100]
}
for image_path in glob.glob("*.png"):
name = os.path.split(image_path)[-1]
_name = os.path.splitext(name)[0]
img = cv2.imread(image_path)
img_height, img_width, _ = img.shape
img_mistakes = np.zeros((img.shape))
color_codes = np.array(list(CLASSES.values()))
# the following two for loops take so long.
for row in range(img_height):
for col in range(img_width):
if not (img[row,col] == color_codes).all(1).any():
img_mistakes[row, col] = [200, 200, 200] # a chosen color
cv2.imwrite(_name + '_mistakes' + '.png', img_mistakes)
解决方案
可能有比这更快的方法,但这是一个开始!我的钱花在@divakar 上以了解它 - 提示,提示 ;-)
#!/usr/local/bin/python3
import numpy as np
import cv2
# Open image into numpy array
im=cv2.imread('start.png')
# Work out how one pixel of each colour we are looking for looks
black = [0,0,0]
blue = [255,0,0]
red = [0,0,255]
green = [0,255,0]
# Find all pixels where the 3 RGB values match the sought colour
blacks = np.all(im==black, axis=2)
blues = np.all(im==blue , axis=2)
reds = np.all(im==red , axis=2)
greens = np.all(im==green, axis=2)
# Make empty (black) output array same size as input image
mistakes = np.zeros_like(im)
# Make anything not matching any of our colours into [200,200,200]
mistakes[~(blacks | blues | reds | greens)] = [200,200,200]
# Save result
cv2.imwrite("result.png",mistakes)
start.png
结果:
推荐阅读
- oracle - DBA_MVIEWS:ORA-00932:不一致的数据类型:预期 - 长
- video - 根据旋转元数据旋转视频并使用 ffmpeg 剥离元数据
- git - 为 bitbucket 从 https 切换到 ssh
- php - 如何在 PHP 中将对象引用实现为数组字段
- c# - Autofac 和 ASP.NET Core:为什么 ASP.NET Core 在从 StartupBase 继承的 Startup 中无法访问 ConfigureContainer 方法?
- php - 如何在 flex 环境和 PHP 运行时使用 GAE 处理 CORS(或任何标头)?
- python - 使用 while 循环检查小数点
- ansible - Ansible:如何将多个文件夹与库存文件中的路径分组
- javascript - Vue.js 应用程序中的预加载器?
- sql - 为什么不删除所有重复项?