как лучше всего обрабатывать изображение для сжатия с помощью кодирования Arithmeti c? - PullRequest
2 голосов
/ 05 августа 2020

Я работал над проектом в node js по сжатию файла .txt. Пока мне удалось достичь этой цели, используя Arithmetic coding для encoding и decoding данных, но теперь я хочу использовать этот код для сжатия изображений, но я не могу понять, как это сделать. Моя основная проблема в том, как мне читать данные из изображения для сжатия. Я не имел ни малейшего представления, как это сделать с Buffer, stream или даже с Blob (когда-то поиск по интересующим тезисам был возможным способом сделать это).

Я знал, что Работа с изображениями в Python довольно проста, поэтому я решил сделать скрипт для чтения изображений с помощью python. На данный момент я не интегрирую Python и Node js, что будет позже.

У меня был небольшой опыт работы с некоторыми python библиотеками, такими как open-csv и Pillow (PIL). До сих пор я использовал функцию cv2.imread(), чтобы прочитать изображение и сохранить его как binary в файле .txt. на данный момент я не интегрировал его с Node js.

from cv2 import cv2

img1 = cv2.imread('cat.png',0)

with open("cat.txt", 'wb') as out:
    out.write(img1.tobytes())

Теперь я использую этот cat.txt файл и читаю эти данные fs в node js, а затем сжимаю и распаковываю его Arithmetic coding.

Теперь к основной проблеме:

Когда я читаю изображение в python и сохраняю его в cat.txt, его размер намного больше, чем cat.png файл. Даже так, что после сжатия этого cat.txt файла результирующий compressed_cat.txt больше, чем cat.png.

cat.png = 242kb, cat.txt(before compression) = 971kb, compressed_cat.txt(after compression) = 251kb

Мне кажется, я неправильно читаю или сохраняю файл. Я не знаю, как решить эту проблему.

Требуется дополнительная помощь

  • Есть ли способ обработать изображение в node js как в python, поэтому мне не нужно интегрировать его позже. Я пробовал Multer и Jimp, но я не мог найти в нем ничего, например python open-csv
  • И я не знаю, как сохранить данные после сжатия, потому что в основном они хранятся в .zip или .rar. Я никогда не сохранял / не читал данные в таком формате.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

У меня нет полного ответа, но я думаю, что следующая информация может помочь -

Форматы изображений, такие как .png, .jpg, и т.д. c уже представляют изображение в сжатом формате. Некоторые из них не с потерями, но чаще всего используются для хранения с потерями для минимизации размера. Так что, честно говоря, я сомневаюсь, что какие-либо алгоритмы сжатия текста могут превзойти уже существующие форматы сжатия изображений.

Одна вещь, которая, как мне кажется, неправильна в вашем подходе, - это чтение изображения с помощью open-cv. Это дает вам представление изображения в виде многомерного массива, если я не ошибаюсь. Отлично, если вы хотите работать с изображением, но я думаю, вы просто хотите напрямую читать байты из файла изображения, чтобы вы могли преобразовать его обратно в исходный файл изображения. Теперь вам решать, как вы работаете с байтами или лежащими в основе битами. Надеюсь, это ответит на часть вашего вопроса.

0 голосов
/ 06 августа 2020

Я искал решение не в том направлении. Но @ Har sh комментарий помог I think you just want to read the bytes from image file directly, so you can convert it back to the original image file. Я внес 2 больших изменения

Сначала способ чтения изображения.

Мне не нужно python для чтения / записи изображения, так как это легко может быть сделано в node-js.

const fs = require("fs");

let data = fs.readFileSync('Cat.png', 'binary');

fs.writeFileSync('Cat_Copy.png', data, 'binary');

Второй Выбор файла для сжатия

В основном .jpeg, .jpg и .png уже сжаты, поэтому обычные методы сжатия с ними не работают. Но файлы .tiff не сжимаются и, по крайней мере, мой алгоритм работает с этим форматом. Тем не менее, это не очень эффективно.

Третий Выбор правильного формата для сохранения файла сжатия

Ну, это не было большой проблемой, поскольку мы может сохранить without any extension, что действительно важно, так это кодировка, в которой он сохранен. Ну в js ucs2 занимает меньше места на диске, чем utf8. Я сохраняю его как filename.ac, поскольку он представляет Arithmetic Coding.

...