python - 计算图像顺序“流”中颜色变化的索引
问题描述
我正在为我的实验室构建一个简单的设备,它实际上以特定的时间间隔捕获图像。例如,这是一系列图像。
向下滚动时,您会注意到这些管内液体的颜色正在发生变化。所以我想要实现的是以编程方式计算与两种情况下液体颜色之间的差异相对应的索引。我以前从未处理过图像分析,因此我想听听您的意见。
到目前为止,我能够从图像中裁剪特定区域并进行简单的数学计算来计算是否存在差异。裁剪图像后,我将其调整为 1x1 像素,以获得它的平均颜色。最后,如您所见,我只使用了 RGB 的绿色和蓝色通道,因为红色通道没有太大的差异。
这是python中的示例代码:
from PIL import Image
import os
img_dir = "./sal1000-2"
area_left = (250,340,350+16,340+37)
area_right = (419,340,419+16,340+37)
left_init = ()
right_init = ()
left = ()
right = ()
flag = 0
for file in sorted(os.listdir(img_dir)):
if file.endswith(".jpg"):
img = Image.open(img_dir+"/"+file)
# CROP THE IMAGE
cropped_left = img.crop(area_left)
cropped_right = img.crop(area_right)
# RESIZE THE IMAGES
resized_left = cropped_left.resize((1,1))
resized_right = cropped_right.resize((1,1))
# Keep the initial values from the first image
if flag == 0 :
left_init = resized_left.getpixel((0,0))
right_init = resized_right.getpixel((0,0))
flag = 1
else :
left = resized_left.getpixel((0,0))
right = resized_right.getpixel((0,0))
redL = left[0]-left_init[0]
greenL = left[1]-left_init[1]
blueL = left[2]-left_init[2]
redR = right[0]-right_init[0]
greenR = right[1]-right_init[1]
blueR = right[2]-right_init[2]
print("LEFT: \t", str(greenL-blueL), "\t RIGHT: \t", str(greenR-blueR), file)
右管用红色表示,而绿色是左管。
正如您所看到的,该算法可以在一开始就区分这两个管子,我不知道这是真的还是由于代码的逻辑而导致的某种伪影。
欢迎任何想法或提示。
解决方案
一些想法和一些代码......
如果您对颜色变化感兴趣,JPEG 通常不是最好的格式选择,因为它会进行色度二次采样,即它会降低颜色准确度以支持亮度准确度,因为人眼对颜色变化的敏感度低于亮度变化 - 请参阅下采样。因此,看看您是否可以在相机上保存为 PNG 或 PPM 格式,这可能会有所帮助。
此外,由于您对颜色变化感兴趣,因此您可能会在HSL 或 HSV 色彩空间中做得更好,因为照明的任何变化都会导致变化较小。因此,我建议您考虑使用代表我们称之为“颜色”的色调。这样做的好处是您只会得到一个值,即色调,而不是三个值,即红色、绿色和蓝色。
因此,话虽如此,代码可能如下所示:
#!/usr/bin/env python3
from PIL import Image
from glob import glob
area_L = (250,340,350+16,340+37)
area_R = (419,340,419+16,340+37)
files = glob("f*.jpg")
files.sort()
for f in files:
print('Processing {}'.format(f))
img = Image.open(f).convert('HSV')
H, S, V = img.split()
cropped_L = H.crop(area_L)
cropped_R = H.crop(area_R)
resized_L = cropped_L.resize((1,1))
resized_R = cropped_R.resize((1,1))
L = resized_L.getpixel((0,0))
R = resized_R.getpixel((0,0))
print('Left Hue: {}, Right Hue: {}'.format(L,R))
输出是:
Processing f00.jpg
Left Hue: 66, Right Hue: 14
Processing f01.jpg
Left Hue: 58, Right Hue: 21
Processing f02.jpg
Left Hue: 57, Right Hue: 26
Processing f03.jpg
Left Hue: 58, Right Hue: 27
Processing f04.jpg
Left Hue: 59, Right Hue: 27
Processing f05.jpg
Left Hue: 57, Right Hue: 26
Processing f06.jpg
Left Hue: 57, Right Hue: 28
Processing f07.jpg
Left Hue: 60, Right Hue: 25
Processing f08.jpg
Left Hue: 60, Right Hue: 25
Processing f09.jpg
Left Hue: 58, Right Hue: 25
Processing f11.jpg
Left Hue: 59, Right Hue: 25
Processing f12.jpg
Left Hue: 59, Right Hue: 25
Processing f13.jpg
Left Hue: 57, Right Hue: 25
Processing f14.jpg
Left Hue: 60, Right Hue: 24
Processing f15.jpg
Left Hue: 58, Right Hue: 28
Processing f16.jpg
Left Hue: 60, Right Hue: 29
Processing f17.jpg
Left Hue: 60, Right Hue: 32
Processing f18.jpg
Left Hue: 60, Right Hue: 33
Processing f19.jpg
Left Hue: 58, Right Hue: 34
推荐阅读
- logging - logging.config.fileConfig : SyntaxError: (unicode 错误)
- python - 将 Iris(.data 文件)拆分为列表列表
- c++ - 使用 2 个容器的 C++ 线程
- python-3.x - 在 for 循环中删除元素
- scheme - Scheme中的'('() 2 3)和'(() 2 3)有什么区别?
- sql-server - SQL Server 命令行工具版本与不同版本的 SQL Server 的兼容性
- redux - Redux 请求状态。减少样板文件
- python-3.x - 尝试为 Jira 问题对象调用 add_attachment 时出现“RuntimeError:迭代期间字典键已更改”,但未使用字典?
- c++ - boost::serialization 中的派生类偏移计算。它有效吗?
- java - Hibernate @ColumnTransformer 注入数据库模式