예제 #1
0
        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]);
                }
            }
        }
예제 #2
0
        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");
        }
예제 #3
0
        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");
        }
예제 #4
0
        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");
            }
        }