计算连续 "stream" 图像中颜色变化的索引

Calculating an index for color changing in a sequential "stream" of images

我正在为我的实验室构建一个简单的设备,它实际上以特定的时间间隔捕获图像。例如,Here 是一系列图像。

向下滚动时,您会注意到这些管内液体的颜色正在发生变化。所以我想要实现的是以编程方式计算一个索引,该索引对应于两种情况下液体颜色之间的差异。我以前从未处理过图像分析,因此我想听听您的意见。

到目前为止,我能够从图像中 crop a specific area 并进行简单的数学运算来计算是否存在差异。裁剪图像后,我将其大小调整为 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)

然后我使用 R 绘制打印值,我得到了这样一个图:

右管用红色表示,绿色是左管。

如您所见,该算法在一开始就可以区分这两个管子,我不知道这是真的还是由于代码的逻辑造成的某种伪像。

欢迎任何想法或提示。

一些想法,一些代码...

如果您对 颜色 变化感兴趣,JPEG 通常不是最佳格式选择,因为它会进行色度子采样,即它会降低颜色精度以提高亮度精度因为人眼对颜色变化的敏感度低于对亮度变化的敏感度 - 请参阅 downsampling。所以,看看您是否可以将相机保存为 PNG 或 PPM 格式,这可能会有所帮助。

此外,由于您对 颜色 变化感兴趣,您最好选择 HSL or HSV colourspace,因为随着光照的变化,颜色变化会更小。因此,我建议您考虑使用 Hue,它代表我们所说的 "colour"。这样做的好处是您只会获得一个值,即色调,而不是三个值,即红色、绿色和蓝色。

因此,话虽如此,代码可能如下所示:

#!/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