Я пытаюсь выполнить базовое сжатие JPEG (DCT + квантование + IDCT) с использованием OpenCV без использования энтропийного кодирования/кодирования Хаффмана. Проблема в том, что после распаковки сжатого изображения оно даже близко не похоже на исходное.
Я следую этим руководствам:
Базовое моделирование сжатия/распаковки JPEG
Базовое сжатие JPEG с использованием OpenCV
Ниже приведены три изображения (исходное, сжатое и распакованное):



Я использую следующую матрицу для яркости и цветности:
double dataLuminance[8][8] = { {16, 11, 10, 16, 24, 40, 51, 61}, {12, 12, 14, 19, 26, 58, 60, 55}, {14, 13, 16, 24, 40, 57, 69, 56}, {14, 17, 22, 29, 51, 87, 80, 62}, {18, 22, 37, 56, 68, 109, 103, 77}, {24, 35, 55, 64, 81, 104, 113, 92}, {49, 64, 78, 87, 103, 121, 120, 101}, {72, 92, 95, 98, 112, 100, 103, 99} }; двойной dataChrominance[8][8] = { {17, 18, 24, 27, 99, 99, 99, 99}, {18, 21, 26, 66, 99, 99, 99, 99}, {24, 26, 56, 99, 99, 99, 99, 99}, {47, 66, 99, 99, 99, 99, 99, 99}, {99, 99, 99, 99, 99, 99, 99, 99}, {99, 99, 99, 99, 99, 99, 99, 99}, {99, 99, 99, 99, 99, 99, 99, 99}, {99, 99, 99, 99, 99, 99, 99, 99} }; // РЕДАКТИРОВАТЬ 1: @Micka рассказала о проблеме использования imread/imwrite, поэтому я отредактировал свой код, чтобы использовать сжатое изображение непосредственно из моей программы.
Метод сжатия:
void ImageCompression::compression(){ // Получаем исходный размер изображения int height = imgOriginal.size().height; int width = imgOriginal.size().width; // Преобразование цвета изображения Мат imgColorConverted; cvtColor (imgOriginal, imgColorConverted, CV_BGR2YCrCb); // Преобразование 2D-массива в матрицу изображений Яркость мата = Mat(8,8, CV_64FC1, &dataLuminance); Матовая цветность = Mat(8,8, CV_64FC1, &dataChrominance); cout