计算图像的连续“流”中颜色变化的索引

时间:2019-04-21 11:34:44

标签: python image-processing colors difference

我正在为我的实验室构建一个简单的设备,该设备实际上以特定的间隔捕获图像。 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绘制打印值,得到了如下图: enter image description here

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

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

欢迎任何想法或提示。

1 个答案:

答案 0 :(得分:1)

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

如果您对颜色更改感兴趣,则JPEG通常不是最佳的格式选择,因为它会进行色度二次采样,即,由于人眼会降低颜色精度,而有利于亮度精度。对颜色变化的敏感性低于对亮度变化的敏感性-请参见downsampling。因此,请查看您是否可以将PNG或PPM格式保存在相机之外,这可能会有帮助。

此外,由于您对颜色的变化感兴趣,因此您在HSL or HSV colourspace上可能会更好一些,因为随着光线的变化,变化将变小。因此,我建议您考虑与Hue合作,后者代表了我们称之为“颜色” 的东西。这样的好处是,您将只获得一个值,即“色相”,而不是三个值,即“红色”,“绿色”和“蓝色”。

因此,这样说,代码可能像这样:

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