在python中比较图像的平均RGB值

scyqe7ek  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(144)

我试图通过图像的平均RGB值来识别图像。但是,这个值可能会在RGB值中有轻微的偏差。我有一个精确值的数组,但在检查时,我希望检查每个元素中的值5或更小。
例如,如果我有一个值为30的红色,我想从25到35检查此颜色,绿色和蓝色也是如此
我有一个numpy数组,如果我打印它,它看起来像这样:[27. 26. 25.]如果它显示一个元素,则具有以下形式:27.0
这是目前代码的样子,我在Windows计算器映像上测试了它

import cv2
import numpy as np
import pygetwindow
import pyautogui
from PIL import Image

path = '../../Desktop/image.png'
titles = pygetwindow.getAllTitles()
flashes = [["25.", "26.", "27."]]

window = pygetwindow.getWindowsWithTitle('Calculator')[0]
left, top = window.topleft
right, bottom = window.bottomright
pyautogui.screenshot(path)
im = Image.open(path)
im = im.crop((left, top, right, bottom))
im.save(path)

src_img = cv2.imread(path)
average_color_row = np.average(src_img, axis=0)
average_color = np.round(np.average(average_color_row, axis=0))
print(average_color)

arr = np.array2string(average_color)
i = iter(average_color)

for x in flashes:
    for y in x:
        arr = np.array2string(next(i))
        print(y)
        print(arr)
        if y == arr:
            print("TRUE")

我想使用循环检查,如果R,G,B从检查的照片是在这个范围内。
例如,我的照片有这样一个平均RGB [25.25.25.],如果检查这些值[27.26.25.],这应该显示为真。
我试着在它周围循环,但我不知道如何完成它,看看是否所有3个值适合3个不同的范围。
有什么建议吗?

s3fp2yjn

s3fp2yjn1#

我会在RGB三元组之间做一个差值,然后检查是否有任何值大于阈值:


# This is a list of values to compare against, I imagine you will have several triplets to compare.

flashes = [["25.", "26.", "27."], ...]

# This is the average calculated from an image, so only one triplet

# ...

average_color = np.round(np.average(average_color_row, axis=0))

# First loop selects the triplet

results = []
for triplet in flashes:

    #Convert strings to floats
    ftriplet = [ float(i) for i in triplet ]
    diff = np.abs(average_color - np.array(ftriplet))
    threshold = 3
    results.append( np.any(diff > threshold ) )

结果是一个True或False的向量,具体取决于是否存在大于阈值的值。

相关问题