Ⅰ 如何用c語言程序從bmp格式的圖片中讀取圖片的灰度值
1、首先要了解bmp點陣圖的格式,搜索些技術支持文檔,bmp點陣圖基本上是分4大部分,文件信息結果部分,文件頭信息結果部分,調色板結果部分,後面就是數據實體部分。及其每個部分對應有用的信息。比如長寬。當然長寬信息你自己可以從window系統下看得到。打開bmp文件,把前面三部分的位元組總數給固定下來,逐個字元讀取,然後讀取數據實體部分,輸出就可以了。
2、常式:
#include<stdio.h>
#include<stdlib.h>
#pragmapack(2)
/*定義WORD為兩個位元組的類型*/
typedefunsignedshortWORD;
/*定義DWORD為e四個位元組的類型*/
typedefunsignedlongDWORD;
/*點陣圖文件頭*/
typedefstructBMP_FILE_HEADER
{
WORDbType;/*文件標識符*/
DWORDbSize;/*文件的大小*/
WORDbReserved1;/*保留值,必須設置為0*/
WORDbReserved2;/*保留值,必須設置為0*/
DWORDbOffset;/*文件頭的最後到圖像數據位開始的偏移量*/
}BMPFILEHEADER;
/*點陣圖信息頭*/
typedefstructBMP_INFO
{
DWORDbInfoSize;/*信息頭的大小*/
DWORDbWidth;/*圖像的寬度*/
DWORDbHeight;/*圖像的高度*/
WORDbPlanes;/*圖像的位面數*/
WORDbBitCount;/*每個像素的位數*/
DWORDbCompression;/*壓縮類型*/
DWORDbmpImageSize;/*圖像的大小,以位元組為單位*/
DWORDbXPelsPerMeter;/*水平解析度*/
DWORDbYPelsPerMeter;/*垂直解析度*/
DWORDbClrUsed;/*使用的色彩數*/
DWORDbClrImportant;/*重要的顏色數*/
}BMPINF;
/*彩色表*/
typedefstructRGB_QUAD
{
WORDrgbBlue;/*藍色強度*/
WORDrgbGreen;/*綠色強度*/
WORDrgbRed;/*紅色強度*/
WORDrgbReversed;/*保留值*/
}RGBQUAD;
intmain()
{
FILE*fp;
BMPFILEHEADERfileHeader;
BMPINFinfoHeader;
longoffset,bmpImageSize,width,height,bytesPerPixel,size,bitCount;
//inti,j;
//unsignedchar**p;
WORDc;
if((fp=fopen("5.bmp","rb"))==NULL)
{
printf("Cann'topenthefile! ");
exit(0);
}
fseek(fp,0,0);
fread(&fileHeader,sizeof(fileHeader),1,fp);
fread(&infoHeader,sizeof(infoHeader),1,fp);
//計算並輸出點陣圖數據的偏移量,圖像的大小,寬度和高度,每個像素點所佔的位元組
size=fileHeader.bSize;
offset=fileHeader.bOffset;
bmpImageSize=infoHeader.bmpImageSize;
width=infoHeader.bWidth;
height=infoHeader.bHeight;
bitCount=infoHeader.bBitCount;
bytesPerPixel=infoHeader.bBitCount/8;
printf("%d%d%d%d%d%d ",size,offset,bmpImageSize,width,height,bitCount,bytesPerPixel);
//輸出每個像素點所佔位元組中的內容
c=fgetc(fp);
while(!feof(fp))
{
printf("%x",c);
c=fgetc(fp);
}
printf(" ");
fclose(fp);
return0;
}
Ⅱ 用C語言調節照片的灰度,寫一段程序,謝謝
彩色圖到灰度圖的轉換
BOOL ColortoGrayScale(HWND hWnd)
{
DWORD SrcBufSize,DstBufSize,DstLineBytes;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
LOGPALETTE *pPal;
HPALETTE hPrevPalette;
HLOCAL hPal;
DWORD NewNumColors;
WORD NewBitCount;
float Y;
DWORD i;
unsigned char Red,Green,Blue,Gray;
NewNumColors=NumColors; //NewNumColors為新圖的顏色數
NewBitCount=bi.biBitCount; //NewBitCount為新圖的顏色位數
if(NumColors==0) //真彩圖
{
NewNumColors=256;
NewBitCount=8;
}
//由於顏色位數有可能發生了改變,所以要重新計算每行佔用的位元組數以及新圖
//的緩沖區大小
DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);
DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*
sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);
//DstBf和DstBi為新的BITMAPFILEHEADER和BITMAPINFOHEADER
從點陣圖數據計算得到Y值,寫入新圖中
Gray=(BYTE)Y;
*(lpTempPtr++)=(unsigned char)Gray;
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
//產生新的點陣圖
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData,
(LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +
NewNumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
if(hPalette && hPrevPalette){
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
hf=_lcreat("c:\\gray.bmp",0);
_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
_lclose(hf);
//釋放內存和資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
Ⅲ C語言 將bmp圖像根據輸入閥值改變灰度的程序輸出的圖像上下顛倒,求糾錯!
bmp格式的圖像一般是倒著存放的,所以你處理的圖像也應該遵循這一點,從最後一行向上一行一行地處理,倒著生成可顯示的圖像。
Ⅳ 怎麼用VC++編寫程序把灰度圖像轉換為黑白圖(二點陣圖)~
假設該灰度圖像在內存中為 BYTE *pBuffer;
圖像寬度為:nWidth;
圖像高度為:nHeight;
黑白圖閾值為:nThreshold = 127;則:
for(int i=0; i<nHeight; i++)
{
for(int j=0; j<nWidth; j++)
{
int &nPixelVal = *(pBuffer * i + j);
if (nPixelVal >= nThreshold)
nPixelVal = 255;
else
nPixelVal = 0;
}
}
Ⅳ 怎樣用C語言實現圖像的灰度化
新建MFC工程吧,先打開bmp格式的圖片,其它格式的壓縮了,需先解碼,再分別取RGB的值為RGB的任意一個,也可取RGB三者的平均值,這樣就可以灰度化了
Ⅵ 如何用c語言實現彩色圖像的灰度化
用c是比較麻煩的
需要圖形介面。
可以用vc/vs的自帶圖形庫
也可以用tc2.0的graphic介面。
或者使用第三方庫。
初始化圖形介面後
在屏幕上打隨機的彩色點,實現下降效果即可。
Ⅶ c語言將圖像轉化為灰度圖像,並將灰度圖像像素值存入二維數組
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(){
img = imread("./lena.png");
cvtColor(img, img, CV_BGR2GRAY);
uchar** pixmat = new uchar*[img.rows];
for(int i = 0; i < img.rows; i++){
pixmat[i] = new uchar[img.cols];
for(int j = 0; j < img.cols; j++){
pixmat[i][j] = img.at<uchar>(i, j);
}}}
//pixmat is demanded 2-D array
Ⅷ 用C語言編寫灰度圖像直方圖變換增強
參考一下這個程序:
#define IMAGEWIDTH 80
#define IMAGEHEIGHT 80
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256]);
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256]);
unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
float fHistogram[256],fHistogram1[256];
unsigned char lut[256];
/* 直方圖統計程序 */
int main()
{
... //准備一幅灰度圖片到dbImage
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); //做直方圖統計
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1); //直方圖增強輸出到dbTargetImage
...//完成後顯示
}
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
{
int i,j;
unsigned int uWork;
unsigned char *pWork;
for ( i=0;i<256;i++ ) fHisto[i]=0.0f;
pWork=pImage;
for ( i=0;i<nHeight;i++ )
{
for ( j=0;j<nWidth;j++,pWork++ )
{
uWork=(unsigned int)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for ( i=0;i<256;i++ )
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])
{
int i,j;
unsigned int uWork;
unsigned char *pWork,*pWork1;
for ( i=0;i<256;i++ )
fHisto1[i]=fHisto[i]/100;
for ( i=1;i<256;i++ )
fHisto1[i]+=fHisto1[i-1];
for ( i=0;i<256;i++ )
lut[i]=fHisto1[i]*256;
for ( i=0;i<256;i++ )
if ( lut[i]>=256 )
lut[i]=255;
pWork=pImage; pWork1=pImage1;
for ( i=0;i<nHeight;i++ )
for ( j=0;j<nWidth;j++,pWork++,pWork1++ )
(*pWork1)=lut[(*pWork)];
}