最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)BMP圖像處理(彩色圖轉灰度圖)

 更新時間:2021年10月25日 17:16:11   作者:傻不拉幾的程序員  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP圖像處理,彩色圖轉灰度圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們知道真彩圖不帶調(diào)色板,每個象素用 3 個字節(jié),表示 R、G、B 三個分量。所以處理很簡單,根據(jù) R、G、B 的值求出 Y 值后,將 R、G、B 值都賦值成 Y,寫入新圖即可。 在YUV 的顏色表示方法中,Y 分量的物理含義就是亮度,它含了灰度圖(grayscale)的所有信息,只用 Y 分量就完全能夠表示出一幅灰度圖來。YUV 和RGB 之間有著如下的對應關系:

再來看看帶調(diào)色板的彩色圖,我們知道位圖中的數(shù)據(jù)只是對應調(diào)色板中的一個索引值,我們只需要將調(diào)色板中的彩色變成灰度,形成新調(diào)色板,而位圖數(shù)據(jù)不用動,就可以了。

以上解釋來自于:《數(shù)字圖像處理編程入門》,代碼參考:C語言實現(xiàn)24位彩色圖像二值化

#include<stdio.h>
#include<windows.h>
 
int main(int argc, char* argv[])
{
 int bmpHeight;
 int bmpWidth;
 unsigned char *pBmpBuf;
 RGBQUAD *pColorTable;
 int biBitCount;
 
 //讀取bmp文件
 FILE *fp = fopen("./02.bmp", "rb");
 if (fp == 0)
  return 0;
 fseek(fp, sizeof(BITMAPFILEHEADER), 0);
 
 BITMAPINFOHEADER head;
 fread(&head, 40, 1, fp);
 bmpHeight = head.biHeight;
 bmpWidth = head.biWidth;
 biBitCount = head.biBitCount;
 
 fseek(fp, sizeof(RGBQUAD), 1);
 
 int LineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;//保證每一行字節(jié)數(shù)都為4的整數(shù)倍
 pBmpBuf = new unsigned char[LineByte*bmpHeight];
 fread(pBmpBuf, LineByte*bmpHeight, 1, fp);
 fclose(fp);
 
 //將24位真彩圖灰度化并保存
 FILE *fp1 = fopen("gray.bmp", "wb");
 if (fp1 == 0)
  return 0;
 int LineByte1 = (bmpWidth * 8 / 8 + 3) / 4 * 4;
 
 //修改文件頭,其中有兩項需要修改,分別為bfSize和bfOffBits
 BITMAPFILEHEADER bfhead;
 bfhead.bfType = 0x4D42;
 bfhead.bfSize = 14 + 40 + 256 * sizeof(RGBQUAD)+LineByte1*bmpHeight;//修改文件大小
 bfhead.bfReserved1 = 0;
 bfhead.bfReserved2 = 0;
 bfhead.bfOffBits = 14 + 40 + 256 * sizeof(RGBQUAD);//修改偏移字節(jié)數(shù)
 fwrite(&bfhead, 14, 1, fp1);    //將修改后的文件頭存入fp1;
 
 //修改信息頭,其中有兩項需要修改,1個位biBitCount:真彩圖為24 ,應改成8;另一個是biSizeImage:由于每像素所占位數(shù)的變化,所以位圖數(shù)據(jù)的大小發(fā)生變化
 BITMAPINFOHEADER head1;
 head1.biBitCount = 8;    //將每像素的位數(shù)改為8
 head1.biClrImportant = 0;
 head1.biCompression = 0;
 head1.biClrUsed = 0;
 head1.biHeight = bmpHeight;
 head1.biWidth = bmpWidth;
 head1.biPlanes = 1;
 head1.biSize = 40;
 head1.biSizeImage = LineByte1*bmpHeight;//修改位圖數(shù)據(jù)的大小
 head1.biXPelsPerMeter = 0;
 head1.biYPelsPerMeter = 0;
 fwrite(&head1, 40, 1, fp1);  //將修改后的信息頭存入fp1;
 
 pColorTable = new RGBQUAD[256];
 for (int i = 0; i < 256; i++){
  pColorTable[i].rgbRed = i;
  pColorTable[i].rgbGreen = i;
  pColorTable[i].rgbBlue = i; //是顏色表里的B、G、R分量都相等,且等于索引值
 }
 fwrite(pColorTable, sizeof(RGBQUAD), 256, fp1); //將顏色表寫入fp1;
 
 //寫位圖數(shù)據(jù)
 unsigned char *pBmpBuf1;
 pBmpBuf1 = new unsigned char[LineByte1*bmpHeight];
 for (int i = 0; i < bmpHeight; i++){
  for (int j = 0; j<bmpWidth; j++){
   unsigned char *pb1, *pb2;
   pb1 = pBmpBuf + i*LineByte + j * 3;
   int y = *(pb1)*0.299 + *(pb1 + 1)*0.587 + *(pb1 + 2)*0.114;   //將每一個像素都按公式y(tǒng)=B*0.299+G*0.587+R*0.114進行轉化
   pb2 = pBmpBuf1 + i*LineByte1 + j;
   *pb2 = y;
  }
 }
 fwrite(pBmpBuf1, LineByte1*bmpHeight, 1, fp1);
 
 fclose(fp1);
 
 system("pause");
 return 0;
}

實驗結果分析:

實驗結果分析:真彩色圖不帶調(diào)色板,而灰度圖的調(diào)色板為256級。所以在修改調(diào)色板時需要將RGB三個分量修改為256級,根據(jù)YUV顏色空間中Y分量計算。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++接口文件小技巧之PIMPL詳解

    C++接口文件小技巧之PIMPL詳解

    C++ 里面有一些慣用法(idioms),如 RAII,PIMPL,copy-swap、CRTP、SFINAE 等,今天要說的是 PIMPL,即 Pointer To Implementation,指向?qū)崿F(xiàn)的指針,感興趣的可以了解一下
    2023-06-06
  • C語言數(shù)據(jù)結構算法之實現(xiàn)快速傅立葉變換

    C語言數(shù)據(jù)結構算法之實現(xiàn)快速傅立葉變換

    這篇文章主要介紹了C語言數(shù)據(jù)結構算法之實現(xiàn)快速傅立葉變換的相關資料,需要的朋友可以參考下
    2017-06-06
  • ipv6實現(xiàn)tcp編程示例

    ipv6實現(xiàn)tcp編程示例

    這篇文章主要介紹了ipv6實現(xiàn)tcp編程示例,需要的朋友可以參考下
    2014-03-03
  • C語言實現(xiàn)掃雷小游戲的全過程記錄

    C語言實現(xiàn)掃雷小游戲的全過程記錄

    這篇文章主要給大家介紹了關于C語言實現(xiàn)掃雷小游戲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C++教程之變量的作用域與生命周期詳解

    C++教程之變量的作用域與生命周期詳解

    在C++編程中,變量的作用域和生命周期是非常重要的概念。了解這些概念可以幫助開發(fā)人員編寫更好的代碼并避免錯誤。在本文中,我們將探討C++中變量的作用域和生命周期,以及如何正確地使用它們
    2023-04-04
  • C語言完整實現(xiàn)12種排序算法(小結)

    C語言完整實現(xiàn)12種排序算法(小結)

    本文主要介紹了C語言完整實現(xiàn)12種排序算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C++實現(xiàn)AVL樹的基本操作指南

    C++實現(xiàn)AVL樹的基本操作指南

    AVL樹是高度平衡的而二叉樹,它的特點是AVL樹中任何節(jié)點的兩個子樹的高度最大差別為1,下面這篇文章主要給大家介紹了關于C++實現(xiàn)AVL樹的相關資料,需要的朋友可以參考下
    2022-01-01
  • 最小生成樹算法之Prim算法

    最小生成樹算法之Prim算法

    這篇文章主要講解了普里姆算法(Prim算法),圖論中的一種算法,可在加權連通圖里搜索最小生成樹,需要的朋友可以參考下
    2015-07-07
  • C語言的數(shù)字游戲算法效率問題探討實例

    C語言的數(shù)字游戲算法效率問題探討實例

    這篇文章主要介紹了C語言的數(shù)字游戲算法效率問題探討實例,需要的朋友可以參考下
    2014-04-04
  • Visual Studio Code安裝和配置的教程

    Visual Studio Code安裝和配置的教程

    這篇文章主要介紹了Visual Studio Code安裝和配置,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03

最新評論

察隅县| 耒阳市| 武冈市| 巴彦淖尔市| 昌黎县| 健康| 佛教| 安仁县| 静海县| 柘城县| 清远市| 那曲县| 五台县| 溧水县| 邵武市| 三穗县| 怀来县| 凌海市| 全椒县| 鄄城县| 田阳县| 伽师县| 海南省| 公主岭市| 即墨市| 安阳县| 望都县| 蓬溪县| 浦县| 巴彦县| 府谷县| 华宁县| 余干县| 白沙| 威远县| 枣强县| 绥阳县| 嘉黎县| 东乌珠穆沁旗| 东兴市| 永顺县|