现在,我有一个代码来提取 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/