refactor idct

This commit is contained in:
2024-05-07 01:31:26 +02:00
parent 4c55afa1f4
commit 31351ea91d
+37 -29
View File
@@ -38,6 +38,41 @@ impl DCT {
} }
quantization_matrix quantization_matrix
} }
/// TODO
// pub fn dct(&self, img: image::DynamicImage) -> [f64; 64] {
// }
pub fn idct(&self, dct_values: [f64; 64]) -> [u8; 64] {
let mut reconstructed: [u8; 64] = [0; 64];
for k in 0..64 {
let x = (k%8) as f64;
let y = (k/8) as f64;
let mut sum = 0.0;
for u in 0..8 {
for v in 0..8 {
let mut alpha = 1.0;
if u == 0 {
alpha = alpha / SQRT_2
}
if v == 0 {
alpha = alpha / SQRT_2
}
let uv = (v*8)+u;
let v = v as f64;
let u = u as f64;
sum +=
alpha *
dct_values[uv] *
((2.0 * x + 1.0) * u * PI / 16.0).cos() *
((2.0 * y + 1.0) * v * PI / 16.0).cos()
}
}
sum = 127.0 + (0.25 * sum).round();
reconstructed[k] = std::cmp::min(255_u8, sum as u8);
}
reconstructed
}
} }
impl Descriptor for DCT { impl Descriptor for DCT {
@@ -48,7 +83,6 @@ impl Descriptor for DCT {
println!("Base quantization matrix:\n{}", print_matrix(self.quantization_matrix)); println!("Base quantization matrix:\n{}", print_matrix(self.quantization_matrix));
println!("Q-{} quantization matrix:\n{}", quality, print_matrix(qmatrix)); println!("Q-{} quantization matrix:\n{}", quality, print_matrix(qmatrix));
let mut dct_values: [f64; 64] = [0.0; 64]; let mut dct_values: [f64; 64] = [0.0; 64];
let mut reconstructed: [u8; 64] = [0; 64];
let img = self.resize(img); let img = self.resize(img);
img.save("resize.png").expect("Error saving file"); img.save("resize.png").expect("Error saving file");
for u in 0..8 { for u in 0..8 {
@@ -88,34 +122,8 @@ impl Descriptor for DCT {
dct_values[i] = dct_values[i] * qmatrix[i] as f64; dct_values[i] = dct_values[i] * qmatrix[i] as f64;
} }
println!("DCT-coefficients, de-quantized:\n {}", print_matrix(dct_values)); println!("DCT-coefficients, de-quantized:\n {}", print_matrix(dct_values));
for k in 0..64 { let reconstructed = self.idct(dct_values);
let x = (k%8) as f64; println!("Reconstructed pixel values:\n{}", print_matrix(reconstructed));
let y = (k/8) as f64;
let mut sum = 0.0;
for u in 0..8 {
for v in 0..8 {
let mut alpha = 1.0;
if u == 0 {
alpha = alpha / SQRT_2
}
if v == 0 {
alpha = alpha / SQRT_2
}
let uv = (v*8)+u;
let v = v as f64;
let u = u as f64;
sum +=
alpha *
dct_values[uv] *
((2.0 * x + 1.0) * u * PI / 16.0).cos() *
((2.0 * y + 1.0) * v * PI / 16.0).cos()
}
}
sum = 127.0 + (0.25 * sum).round();
//println!("Reconstructed pixel: {}", sum);
reconstructed[k] = std::cmp::min(255_u8, sum as u8);
}
//println!("{}", print_matrix(reconstructed));
save_buffer( save_buffer(
"reconstructed.png", "reconstructed.png",
&reconstructed, &reconstructed,