CV2 меняет изображение - PullRequest
       11

CV2 меняет изображение

0 голосов
/ 11 декабря 2018

У меня есть следующий код:

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 Image с тем же результатом.

1 Ответ

0 голосов
/ 11 декабря 2018

Явление, с которым вы столкнулись, является результатом того, что сжатие данных не определено на 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")
...