国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#生成影像金字塔的原理實例

2020-01-24 03:22:06
字體:
來源:轉載
供稿:網友

這里首先先講一下金字塔的原理:

影像金字塔就是把一個原始圖像處理成一個類似于塔狀的影像結構(請不要糾結于這個概念)

在影像金字塔中最精細層的分辨率為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;

}

按照我寫的這個函數來建造金字塔,此時相鄰圖層之間的對應點像素值就相等了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 景宁| 会同县| 永仁县| 武乡县| 杭州市| 大田县| 大荔县| 综艺| 原阳县| 江华| 菏泽市| 腾冲县| 大宁县| 浙江省| 紫云| 冷水江市| 盐边县| 瑞昌市| 仪征市| 永昌县| 汤阴县| 大悟县| 凤庆县| 宝鸡市| 枣阳市| 固阳县| 吉木萨尔县| 象山县| 鹿泉市| 潜山县| 七台河市| 泗洪县| 盐池县| 西畴县| 霍林郭勒市| 定襄县| 博湖县| 高平市| 称多县| 惠东县| 新竹县|