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

C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(彩色圖轉(zhuǎn)灰度圖)

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

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

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

以上解釋來(lái)自于:《數(shù)字圖像處理編程入門(mén)》,代碼參考:C語(yǔ)言實(shí)現(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;
 
 //修改文件頭,其中有兩項(xiàng)需要修改,分別為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;
 
 //修改信息頭,其中有兩項(xiàng)需要修改,1個(gè)位biBitCount:真彩圖為24 ,應(yīng)改成8;另一個(gè)是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); //將顏色表寫(xiě)入fp1;
 
 //寫(xiě)位圖數(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;   //將每一個(gè)像素都按公式y(tǒng)=B*0.299+G*0.587+R*0.114進(jìn)行轉(zhuǎn)化
   pb2 = pBmpBuf1 + i*LineByte1 + j;
   *pb2 = y;
  }
 }
 fwrite(pBmpBuf1, LineByte1*bmpHeight, 1, fp1);
 
 fclose(fp1);
 
 system("pause");
 return 0;
}

實(shí)驗(yàn)結(jié)果分析:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換

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

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

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

    C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的全過(guò)程記錄

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

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

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

    C語(yǔ)言完整實(shí)現(xiàn)12種排序算法(小結(jié))

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

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

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

    最小生成樹(shù)算法之Prim算法

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

    C語(yǔ)言的數(shù)字游戲算法效率問(wèn)題探討實(shí)例

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

    Visual Studio Code安裝和配置的教程

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

最新評(píng)論

珲春市| 抚松县| 烟台市| 宜宾市| 盈江县| 潞西市| 梧州市| 鄱阳县| 伊金霍洛旗| 额敏县| 鄂伦春自治旗| 盐边县| 宜丰县| 通化市| 白河县| 连州市| 监利县| 泸定县| 滨州市| 双江| 芷江| 昌邑市| 淄博市| 保靖县| 康平县| 恭城| 永福县| 石泉县| 白山市| 定安县| 乌拉特后旗| 扬中市| 汉中市| 洪江市| 靖江市| 建阳市| 平邑县| 安图县| 黔江区| 平昌县| 南华县|