首页 > 解决方案 > 计算图像顺序“流”中颜色变化的索引

问题描述

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

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

到目前为止,我能够从图像中裁剪特定区域并进行简单的数学计算来计算是否存在差异。裁剪图像后,我将其调整为 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 来绘制打印值,我得到了这样的图: 在此处输入图像描述

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

正如您所看到的,该算法可以在一开始就区分这两个管子,我不知道这是真的还是由于代码的逻辑而导致的某种伪影。

欢迎任何想法或提示。

标签: pythonimage-processingcolorsdifference

解决方案


一些想法和一些代码......

如果您对颜色变化感兴趣,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

推荐阅读