python - 检查两个图像的 RGB 值之间的差异

标签 python python-3.x image opencv math

现在,我有一个代码来提取 RGB 值并计算两个给定图像之间的差异,但我注意到一个图像中的一个问题,这让我停下来思考我是否做得正确。

这是我的代码:

import cv2
import math

dif_R = 0
dif_G = 0
dif_B = 0

img = cv2.imread("image1.jpg", cv2.IMREAD_COLOR)
imgcom = cv2.imread("image2.jpg", cv2.IMREAD_COLOR)


pixel = 100 / (img.shape[0] * img.shape[1])
for ih in range(img.shape[0]):
    for iw in range(img.shape[1]):
        pixelB, pixelG, pixelR = img[ih][iw]

        pixelR = int(pixelR)
        pixelG = int(pixelG)
        pixelB = int(pixelB)

        pixelcomB, pixelcomG, pixelcomR = imgcom[ih][iw]

        pixelcomR = int(pixelcomR)
        pixelcomG = int(pixelcomG)
        pixelcomB = int(pixelcomB)

        if pixelR != pixelcomR:
            dif = math.fabs(pixelR - pixelcomR)
            dif_R += (dif / 255) * pixel

        if pixelG != pixelcomG:
            dif = math.fabs(pixelG - pixelcomG)
            dif_G += (dif / 255) * pixel

        if pixelB != pixelcomB:
            dif = math.fabs(pixelB - pixelcomB)
            dif_B += (dif / 255) * pixel

print(dif_R, dif_G, dif_B)

我的图像是这样的:https://imgur.com/a/ryqf11r

如果执行代码,您可以看到,R 的差异为 11.78,G 的差异为 14.02,B 的差异为 16.66。但是您可以清楚地看到第一张图像是紫色的,而另一张图像是橙色的。

我看到了一种可选方法,即使用实验室色彩空间。这种方法的差异很大,但我需要 rgb 值...并且不知道我应该做什么...

如何解决这个问题或做其他事情来获得最准确的差异?我的代码做错了什么?

最佳答案

我想首先指出,您尝试实现此目标的方式效率非常低 - 在处理图像时绝对不需要逐个循环像素值。 Numpy 在向量运算方面非常强大,可以节省您宝贵的时间,尤其是在处理大量图像时。我为您提供了一个不同的实现,根据我对问题的理解,它应该可以解决您的问题。

from PIL import Image
import numpy as np

def jpg_image_to_array(image_path):
    """
    Loads JPEG image into 3D Numpy array of shape (width, height, channels)
    in double precision 
    """
    with Image.open(image_path) as image:
        im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)
        im_arr = im_arr.reshape((image.size[1], image.size[0], 3)) /255
    return im_arr

img1 = jpg_image_to_array("1.jpg")
img2 = jpg_image_to_array("2.jpg")
diff = np.absolute(img1 - img2) 
print(np.sum(diff,axis=(0,1)))

请注意,此代码计算 R、G、B channel 之间的绝对差值,然后将该差值相加。您的图像结果:

[289702.61960608 344853.21176722 409960.28628742]

其中前三分之一的数字分别是 R、G、B channel 的差值之和。这对我来说很有意义,因为您的图像中有 1281 x 1920 像素。

如果您正在寻找平均差异,您可以将此列表除以像素数,即:

n_pixels = img1.shape[0]*img1.shape[1]

结果是:

[0.11778828 0.14021159 0.16668305]

关于python - 检查两个图像的 RGB 值之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59303243/

相关文章:

python - 只要子进程仍在运行,subprocess.Popen 后关闭套接字就会在 TIME_WAIT 中留下套接字

Python 在变量名中使用时不区分某些 unicode 字符

css - Chrome 不按比例缩放

php - 转换 BBCode 文本时检查图像大小

python - 如何在Python中将数字减法字符串转换为整数?

image - 在图像上定位 "black rectangles"- 与语言无关

python - MQTT 是如何工作的?如果接收方文件在发送方文件之后启动,则无法获取数据

python - 保持卡住集中元素的顺序

python - 在 'from modulename import variable' 的情况下,可变性是否会改变命名空间的行为?

python - 递归函数变量混淆