为了账号安全,请及时绑定邮箱和手机立即绑定

CV2改变图像

CV2改变图像

红糖糍粑 2021-09-14 15:44:10
我有以下代码:import cv2 as cvimport numpy as npim = 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 Image,结果相同。
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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


如果要确保图像确实相同,则应比较解码后的像素值。以不重新发明轮子的名义,我将向您推荐这篇关于该主题的优秀博客文章。


编辑:链接的文章对我来说加载不一致,所以我在这里复制了代码以供参考。


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")


查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信