Почему я не могу доказать, что PNG, созданный из JPEG, идентичен для любого пикселя? [дубликат]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему я не могу доказать, что PNG, созданный из JPEG, идентичен для любого пикселя? [дубликат]

Сообщение Anonymous »

Файлы PNG не имеют потерь (сжимаются так, что данные не теряются). PNG, созданный из JPEG, должен быть идентичным по пикселям, при условии одинаковой глубины цвета. Это легко доказать, сравнив значения RGB для одних и тех же пикселей в Krita или GIMP. Python и Go показывают расхождения одного значения R, G или B на один бит.

Код: Выделить всё

use image;
use std::env;

fn main() {
println!("Hello, world!");

let file1 = "image.png";
let file2 = "image.jpeg";

let img1 = image::open(file1).unwrap();
let img2 = image::open(file2).unwrap();

let img1_rgb = img1.to_rgb8();
let img2_rgb = img2.to_rgb8();

let mut img1_iter = img1_rgb.pixels();
let mut img2_iter = img2_rgb.pixels();

let mut i = 0;
let length = img1_iter.len();

while i < length {
let pixel1 = img1_iter.next();
let pixel2 = img2_iter.next();

println!("Pixel 1: {:?} Pixel 2: {:?}", pixel1, pixel2);

if pixel1 != pixel2 {
println!("Difference found: {:?}, {:?}", pixel1, pixel2);
}

println!();
i += 1;
}
}
Оба изображения сохраняются в формате 8-битного RGB. Однако для образца ввода изображения, который имеет R и G 255, Blue 0 как в JPEG, так и в PNG-изображении через Krita и Gimp, моя программа вместо этого сообщит JPEG как 254, 254, 0. Остальные цвета также отличаются на один бит. Иногда ограничивается одним цветом, иногда несколькими.
Пример Python:

Код: Выделить всё

from PIL import Image

png = Image.open("cat.png")
jpg = Image.open("cat.jpg")

pngPixels = png.load()
jpgPixels = jpg.load()

width, height = png.size

print("Width: ", width, "Height: ", height)

for x in range(width):
for y in range(height):
if pngPixels[x,y] != jpgPixels[x,y]:
print("Discrepancy at: ", x, " y: ", y)
print("png: ", pngPixels[x,y], "jpeg: ", jpgPixels[x,y])
print()
Я могу даже добавить эти строки без изменений:

Код: Выделить всё

png = png.convert('RGB')
jpg = jpg.convert('RGB')
Что здесь происходит? Я пробовал экспортировать из GIMP, из Krita, с различными параметрами экспорта и даже с помощью инструмента командной строки. Результаты все те же. Есть ли в JPEG цветовой профиль, который не читается этими библиотеками, которые учитывает Krita/GIMP? Что я могу сделать, чтобы решить эту проблему? Изображения идентичны на уровне пикселей, но я хочу доказать это с помощью программирования.
Из комментария Куто следует, что JPEG позволяет декодировать не на 100% точно. Википедия изменила свой список после публикации другого сообщения о переполнении стека. Учитывая это, я решил получить больше информации:

Код: Выделить всё

from PIL import Image
import numpy

png = Image.open("cat.png")
jpg = Image.open("cat.jpg")

pngPixels = png.load()
jpgPixels = jpg.load()

width, height = png.size

print("Width: ", width, "Height: ", height)

correct = 0
off_by_one = 0
off_by_two = 0
off_by_three = 0
off_by_more = 0

for x in range(width):
for y in range(height):
# print("hit")
if pngPixels[x,y] != jpgPixels[x,y]:
if numpy.all(abs(numpy.subtract(jpgPixels[x, y], pngPixels[x, y]))  pixel,
None => {
println!("Error: {:?}", i);
panic!("No pixel was found!");
},
};

// println!("Pixel 1: {:?} Pixel 2: {:?}", pixel1, pixel2);

if pixel1 != pixel2 {
if ((pixel2[0] as i32 - pixel1[0] as i32).abs() 

Подробнее здесь: [url]https://stackoverflow.com/questions/78796072/why-cant-i-prove-that-a-png-created-from-a-jpeg-is-identical-for-any-pixel[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»