CV2改变图像

问题描述 投票:1回答:1

我有以下代码:

import cv2 as cv
import numpy as np

im = cv.imread('outline.png', cv.IMREAD_UNCHANGED)
cv.imwrite('output.png', im)


f1 = open('outline.png', 'rb')
f2 = open('output.png', 'rb')

img1_b = b64encode(f1.read())
img2_b = b64encode(f2.read())

print(img1_b)
print(img2_b)

那是什么img1_b和img2_b不同的原因是什么? img2_b是更长的时间 - 这是为什么?

我不想复制的文件 - 我想节约但不包括这部分代码之前对其进行处理。

无论outline.png和output.png看起来运行后相同。

我能在我的代码更改,使img2_b值相同img1_b?

我曾尝试PIL图像的相同的结果。

python python-3.x numpy base64 cv2
1个回答
2
投票

你所遇到的现象是不是100%的严格定义的数据压缩的结果。 PNG文件使用DEFLATE压缩,这需要一个给定的压缩文件必须解压缩到相同的输出,但不要求给定的输入必须产生相同的压缩文件。这给出了空间的压缩算法,其中一个更优化的压缩可以在不同类型的文件中找到改进。这听起来像你原来的图像比cv2使用使用更好的(或者只是不同)算法进行压缩。为了复制确切的压缩版本你可能需要完全一样的实现,用于创建原始图像压缩算法。

如果你想确保图像确实是相同的,你应该比较解码后的像素值。在不重新发明轮子的名字,我将把你this关于这个问题的优秀博客文章。

编辑:链接的文章没有始终如一地加载用于我,所以我在这里复制的代码引用。

import cv2
import numpy as np

original = cv2.imread("imaoriginal_golden_bridge.jpg")
duplicate = cv2.imread("images/duplicate.jpg")

# 1) Check if 2 images are equals
if original.shape == duplicate.shape:
    print("The images have same size and channels")
    difference = cv2.subtract(original, duplicate)
    b, g, r = cv2.split(difference)
    if cv2.countNonZero(b) == 0 and cv2.countNonZero(g) == 0 and cv2.countNonZero(r) == 0:
        print("The images are completely Equal")
© www.soinside.com 2019 - 2024. All rights reserved.