public void TestGenerateDCTReverseBlock() { double[,] block = new double[4, 4] { { 242.7500, 48.4317, -9.7500, 23.5052 }, { -12.6428, -54.0659, 7.4278, 22.7950 }, { -6.2500, 10.7158, -19.7500, -38.8046 }, { 40.6852, -38.7050, -11.4653, -45.9341 } }; var matrix = DCTCompression.GenerateDCTReverseBlock(block); var shouldBe = new int[4, 4] { { 42, 66, 68, 66 }, { 92, 4, 76, 17 }, { 79, 85, 74, 71 }, { 96, 93, 39, 3 } }; for (int i = 0; i < 4; i++) { for (int k = 0; k < 4; k++) { Assert.Equal(shouldBe[i, k], matrix[i, k]); } } }
public void TestGetDCTImage() { var image = ImageFile.LoadBmpImage("..\\..\\..\\TestImages\\lenna_gray.bmp"); BmpImage dctImage = new DCTCompression(image, 15).GetDCTImage(); ImageFile.SaveBmpImage(dctImage, "..\\..\\..\\TestImages\\lenna_dct_modified.bmp"); }
public void TestGetDCTReverseImageWithCompression() { var image = ImageFile.LoadBmpImage("..\\..\\..\\TestImages\\lenna_gray.bmp"); var dct = new DCTCompression(image, 15); BmpImage dctImage = dct.GetDCTImage(); ImageFile.SaveBmpImage(dctImage, "..\\..\\..\\TestImages\\lenna_dct_comp_modified.bmp"); BmpImage reverseImage = dct.GetDCTReverseImage(8.0); ImageFile.SaveBmpImage(reverseImage, "..\\..\\..\\TestImages\\lenna_dct_reverse_comp_modified.bmp"); }
private static void ModuleThree(BmpImage image) { /* * 图像压缩模块 * 1.无损预测编码+符号编码 * 2.均匀量化 * 3.DCT变换及DCT反变换 */ int photoFormat = CheckPhoto(image); if (photoFormat == 1) { System.Console.WriteLine("\n检测图片为8bit灰度图像"); System.Console.WriteLine("可选择的压缩模式:\n1.无损预测编码\n2.均匀量化\n3.DCT变换及DCT反变换\n0.返回"); bool inputNum = false; do { try { int num = Convert.ToInt32(System.Console.ReadLine()); if (num < 4 && num > -1) { inputNum = true; //1.无损预测编码 if (num == 1) { System.Console.WriteLine("\n输如文件保存的路径:"); string CompressPath = System.Console.ReadLine(); string savedFilePath = Path.GetDirectoryName(CompressPath); string fileName = Path.GetFileNameWithoutExtension(CompressPath); LinearPredictor lp = new LinearPredictor(image, savedFilePath, fileName); lp.predicate(); //system.console.writeline("{0},{1}", savedfilepath, filename); System.Console.WriteLine("***************保存中***************"); System.Console.WriteLine("压缩文件已保存至{0}\n", CompressPath); System.Console.WriteLine("完成无损预测编码!"); } //2.均匀量化 else if (num == 2) { System.Console.WriteLine("\n压缩比(输如0为IGS量化):"); double CompressRatio = Convert.ToDouble(System.Console.ReadLine()); if (CompressRatio == 0) { UniformQuantizing igs = new UniformQuantizing(image); image = igs.InverseUniformQuantizaing(); } else { UniformQuantizing uq = new UniformQuantizing(image, CompressRatio); image = uq.InverseUniformQuantizaing(); } System.Console.WriteLine("完成均匀量化!"); } //3.DCT变换及DCT反变换 else if (num == 3) { System.Console.WriteLine("\n设置分块大小:"); int blockSize = Convert.ToInt32(System.Console.ReadLine()); var dct = new DCTCompression(image, blockSize); image = dct.GetDCTImage(); //DCT反变换 BmpImage reverseImage = dct.GetDCTReverseImage(1.0); //即将50%的高频系数用0代替 DCT反变换 BmpImage reverseHalfImage = dct.GetDCTReverseImage(2.0); System.Console.WriteLine("\n把DCT反变换的结果存储至:"); string reverseImagePath = System.Console.ReadLine(); ImageFile.SaveBmpImage(reverseImage, @reverseImagePath); System.Console.WriteLine("显示图片?(1 or 2)"); int display1 = Convert.ToInt32(System.Console.ReadLine()); if (display1 == 1) { showPhoto(reverseImagePath); } System.Console.WriteLine("把DCT反变换(50%)的结果存储至:"); string reverseHalfImagePath = System.Console.ReadLine(); ImageFile.SaveBmpImage(reverseHalfImage, @reverseHalfImagePath); System.Console.WriteLine("显示图片?(1 or 2)"); int display2 = Convert.ToInt32(System.Console.ReadLine()); if (display2 == 1) { showPhoto(reverseHalfImagePath); } System.Console.WriteLine("完成DCT变换及反变换!"); } else { ; } } else { System.Console.Write("输入错误请重新输入:"); } } catch (OverflowException) { System.Console.WriteLine("err:转化的不是一个int型数据"); } catch (FormatException) { System.Console.WriteLine("err:格式错误"); } catch (ArgumentNullException) { System.Console.WriteLine("err:null"); } } while (inputNum == false); } else { System.Console.Write("\n图片形式不支持图像压缩哟~\n"); } }