zoukankan      html  css  js  c++  java
  • C#生成影像金字塔

    最近在处理一个关于影像金字塔的问题,这个金字塔程序是用C#写的,

    这里首先先讲一下金字塔的原理:

    影像金字塔就是把一个原始图像处理成一个类似于塔状的影像结构(请不要纠结于这个概念)

    在影像金字塔中最精细层的分辨率为16*16,下一层是8*8,依次为4*4,2*2,1*1

    如下图所示:

    图中网格顶点表示原始图像16*16;红色差号代表8*8;黑色圆圈代表4*4.

    按照上述原理,那么编程实现不过就是隔点采样,那么相邻两幅图像在对应点上的灰度值应该相等,当然我是这么想的。

    C#在Drawing命名空间下的Bitmap类里面有一个处理影像金字塔的函数,

    public void mipmaping()

    {

        Bitmap jpgsource =new  Bitmap(@"E:\height512.jpg");

        Bitmap jpgTarget = new Bitmap(jpgsource, jpgsource.Width>>1, jpgsource.Height>>1);

        jpgTarget.Save(@"E:\height256.jpg");

      }

    但是经过我逐像素对比之后,发现这两张图上对应点的像素并不相等,这说明一个问题:C#里的这个方法肯定不是按照逐点采样,而是采用某种方法把图像拉伸的。这似乎不太符合金字塔的原理,所以我又重新写了一个金字塔的函数:

    public void Rescale()

     {

       Bitmap myImage1024 = new Bitmap(@"E:\height.jpg");

       int width = myImage1024.Height; ;

       int height = myImage1024.Width; ;

       Console.WriteLine(DateTime.Now.ToString());

       for (int power = 1; power < 3; power++)

        {

          Bitmap myImage = new Bitmap(width >> power, height >> power);

          int row = myImage.Height;

          int column = myImage.Width;

          for (int i = 0; i < row; i++)

           for (int j = 0; j < column; j++)

           {   //这里是精要,实际上就是按照采样间距 踩点

               int i1024 = getcoor(i, power); int j1024 = getcoor(j, power);

               Color color1024 = myImage1024.GetPixel(i1024, j1024);

               myImage.SetPixel(i, j, color1024);

           }

               myImage.Save(string.Format(@"E:\myjpg\height{0}.jpg", width >> power));

         }

               Console.WriteLine(DateTime.Now.ToString());

    }

    public int getcoor(int i,int power)

    {

        if (power > 1)

            return 2 * getcoor(i,power-1) +1;

        else

            return 2 * i + 1;

    }

    按照我写的这个函数来建造金字塔,此时相邻图层之间的对应点像素值就相等了。

    作者: 风云

    出处: http://www.cnblogs.com/fengyunlishi/

    本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

    作者: 风云 出处: http://www.cnblogs.com/fengyunlishi/ 本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Mysql设置字段唯一,值唯一方式
    在tomcat中模块化部署项目
    优化Eclipse
    akka 服务的搭建
    ES6中的let和var区别
    jquery,$,选择器,正则表达式
    jsp页面用java代码取随机数
    为什么要做权限管理
    将字符串编码成数值,求数值最大和问题
    Cookie与Session的区别
  • 原文地址:https://www.cnblogs.com/fengyunlishi/p/3070101.html
Copyright © 2011-2022 走看看