亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用C語言實現bmp圖像對比度擴展

發布時間:2021-10-25 16:23:33 來源:億速云 閱讀:218 作者:iii 欄目:開發技術

這篇文章主要介紹“如何用C語言實現bmp圖像對比度擴展”,在日常操作中,相信很多人在如何用C語言實現bmp圖像對比度擴展問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何用C語言實現bmp圖像對比度擴展”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

假設有一幅圖,由于成象時光照不足,使得整幅圖偏暗(例如,灰度范圍從0到63);或者成象時光照過強,使得整幅圖偏亮(例如,灰度范圍從200到255),我們稱這些情況為低對比度,即灰度都擠在一起,沒有拉開。灰度擴展的意思就是把你所感性趣的灰度范圍拉開,使得該范圍內的象素,亮的越亮,暗的越暗,從而達到了增強對比度的目的。

圖中的橫坐標gold表示原圖的灰度值,縱坐標gnew表示gold經過對比度擴展后得到了新的灰度值。a,b,c為三段直線的斜率,因為是對比度擴展,所以斜率b>1。g1old和g2old表示原圖中要進行對比度擴展的范圍,g1new和g2new表示對應的新值。用公式表示為:

如何用C語言實現bmp圖像對比度擴展

實現代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)   //全緊湊模式

typedef struct {
 unsigned char bfType[2];
 unsigned int bfSize;
 unsigned short bfReserved1;
 unsigned short bfReserved2;
 unsigned int bfOffBits;
}bitmapFileHeader;

typedef struct {
 unsigned int biSize;
 unsigned int biWidth;
 unsigned int biHeight;
 unsigned short biPlanes;
 unsigned short biBitCount;
 unsigned int biCompression;
 unsigned int biSizeImage;
 unsigned int biXPixPerMeter;
 unsigned int biYPixPerMeter;
 unsigned int biClrUsed;
 unsigned int biClrImportant;
}bitmapInfoHeader;


typedef struct{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;

}rgbQUAD;

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 rgbQUAD palette[256];
 unsigned char *imgData;
}bmp;

int main(){
 FILE *fp;
 if((fp=fopen("d:\Temp\\test_gray.bmp","rb"))==NULL){
  perror("can not open file!");
  return -1;
 }
 //讀入彩色bmp圖像文件頭,信息頭和圖像數據
 bitmapFileHeader bfHeader;
 fread(&bfHeader,14,1,fp);
 bitmapInfoHeader biHeader;
 fread(&biHeader,40,1,fp);
 int imSize=biHeader.biSizeImage;
 int width=biHeader.biWidth;
 int height=biHeader.biHeight;
 int bitCount=biHeader.biBitCount;
 int lineBytes=(width*bitCount+31)/32*4;
 
 fseek(fp,bfHeader.bfOffBits,SEEK_SET);
 unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));
 fread(imageData,imSize*sizeof(unsigned char),1,fp); 
 fclose(fp);

 bmp b;
 memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));
 memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));
 b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*imSize);
 memset(b.imgData,0,sizeof(unsigned char)*imSize);
 for(int i=0;i<256;i++){
  b.palette[i].rgbBlue=i;
  b.palette[i].rgbGreen=i;
  b.palette[i].rgbRed=i;
 }
 
 int i,j,temp;
 double m=1.5,g1=100.0,g2=200.0; //m在這里對應斜率b,因為“b”這個符號被bmp圖像結構名占了
 double a=(255.0-m*(g2-g1))/(255.0-(g2-g1));
 for(i=0;i<height;i++){
  for(j=0;j<width;j++){
   temp=imageData[lineBytes*i+j];
   if(temp<g1)
    b.imgData[lineBytes*i+j]=(unsigned char)(a*temp);
   else if(temp<g2)
    b.imgData[lineBytes*i+j]=(unsigned char)(g1+m*(temp-g1));
   else 
    b.imgData[lineBytes*i+j]=(unsigned char)(g2+a*(temp-g2));

  }
 }
 
 char savePath[]="D:\Temp\\save_test.bmp";
 FILE *f_save=fopen(savePath,"wb");
 if(f_save==NULL){
  perror("can not open file!");
  return -2;
 }

 fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f_save);
 fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f_save);
 fwrite(&b.palette,1024,1,f_save);
 fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f_save);
 fclose(f_save);
 
 free(imageData);
 free(b.imgData);
 getchar();
 return 0;
}

到此,關于“如何用C語言實現bmp圖像對比度擴展”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大姚县| 乌恰县| 新巴尔虎左旗| 无锡市| 连云港市| 昭平县| 辉县市| 吉水县| 兰西县| 清苑县| 太白县| 余干县| 巴里| 陕西省| 秭归县| 涞水县| 通山县| 桃园县| 长乐市| 托里县| 宁晋县| 丹东市| 博爱县| 丰都县| 金寨县| 钟山县| 改则县| 旬邑县| 资源县| 通城县| 永春县| 桂林市| 涟源市| 宝山区| 灌南县| 梅河口市| 大英县| 宜州市| 北碚区| 鄢陵县| 和静县|