當前位置:首頁 » 編程語言 » c語言灰度圖

c語言灰度圖

發布時間: 2023-03-24 09:54:38

❶ 請教c語言大俠,將rgb圖片轉成二值圖,演算法怎麼處理,具體對像素存儲指針*bitmap_ptr 怎麼處理,感謝!

二值圖也是灰度圖,灰度是指單波段0-255
看看這個函數 wr_dat_only (bitmap_ptr[i+j]); 具體做了啥演算法。

❷ 幫幫我,用c語言編程,製作一個256*256的灰度圖

彩色圖到灰度圖的轉換
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

//拷貝原來的頭信息

memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

//做必要的改變

DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+

sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER));

DstBi.biClrUsed=0;

DstBi.biBitCount=NewBitCount;

/搏陪/原圖的緩沖區的大纖簡小

SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|

MB_ICONEXCLAMATION);
return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//拷貝頭信息和點陣圖數據

memcpy(lpTempImgData,lpImgData,DstBufSize);

//用新的BITMAPINFOHEADER替換原來的頭信息

memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));

//lpPtr指向原圖的數據

lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

//lpTempPtr指向新圖的數據

lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

//為新的調色板分配內存

hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors

* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);

pPal->palNumEntries =(WORD) NewNumColors;

pPal->palVersion = 0x300;

if(NumColors==0) //真彩色

for (i = 0; i < 256; i++) { //灰度從(0,0,0)到(255,255,255)

pPal->palPalEntry[i].peRed=(BYTE)i;

pPal->palPalEntry[i].peGreen=(BYTE)i;

pPal->palPalEntry[i].peBlue=(BYTE)i;

pPal->palPalEntry[i].peFlags=(BYTE)0;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=0;

}

else

for (i = 0; i < NewNumColors; i++) { //帶調色板的彩色圖

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

Y=(float)(Red*0.299+Green*0.587+Blue*0.114);

Gray=(BYTE)Y;

lpPtr++;

//從原來的調色板中的顏色計算得到Y值,寫入新的調色板

pPal->palPalEntry[i].peRed=Gray;

pPal->palPalEntry[i].peGreen=Gray;

pPal->palPalEntry[i].peBlue=Gray;

pPal->palPalEntry[i].peFlags=0;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=0;

}

if(hPalette!=NULL)

DeleteObject(hPalette);

//生成新的邏輯調色板

hPalette=CreatePalette(pPal);

LocalUnlock(hPal);

LocalFree(hPal);

hDc=GetDC(hWnd);

if(hPalette){

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

RealizePalette(hDc);

}

if(NumColors==0) //真彩色圖才需要處理點陣圖數據

for(y=0;y<bi.biHeight;y++){

lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);

lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes);

for(x=0;x<bi.biWidth;x++){

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

Y=(float)(Red*0.299+Green*0.587+Blue*0.114);

//從點陣圖數據計算得到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語言編程實現海表溫度等灰度圖象的偽彩色編碼,要求有色標表示。

省略掉圖像格式什麼的,用8位rgb圖像來做清鋒游的話答銷,大概思路可以這樣:
若圖像尺寸為H * L,源圖像數據保存在數組unsigned char image_src[H][L],處理後得到圖像
unsigned char image_dest[3][H][L],柱狀色標保存在unsigned char color[256][3]中。

則:
先構造色標:(若灰度從0-255,對應R:0-255;基肢G:255-0;B:255-0)
for(i = 0; i < 256; i++)
{
color[i][0] = i;

color[i][1] = 255 - i;

color[i][2] = 255 - i;

}

上色:
for(i = 0; i < H; i++)
{
for (j = 0; j < L; j++)

{

image_dest[i][j][0] = color[image_src[i][j]][0];

image_dest[i][j][1] = color[image_src[i][j]][1];

image_dest[i][j][2] = color[image_src[i][j]][2];

}

}

❹ 對這個C語言程序很感興趣,但是不知道它的每個步驟是什麼意思,求大蝦解釋。

// 我只是簡單的看了一下,難免有錯,請見諒。希望能幫助您,如果有問題請回復。
// 祝你學習順利

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <malloc.h>
# include <ctype.h>
# include <process.h>
# include <windows.h>
// 上面這些是頭文件,include之後可以使用其中定義的函數和變數,比如Include <string.h>之後就可以使用string這個類了。

int bitmapToGray(char *OriginalBMP,char *ResultBMP); //聲明了一個函數將bitmap轉換為灰度圖像,括弧裡面的是輸入的變數。這個相當於告訴編譯器,後面會有一個函數叫這個名字,但沒有具體定義函數內容。

int main() // 這個main函數是整個程序的入口,進入入口之後,程序會調用bitmapToGray這個函數。
{
bitmapToGray("C:\\Users\\Sky\\Desktop\\LONGJIANG.bmp",
"C:\\Users\\Sky\\Desktop\\LONGJIANG2.bmp");
return 0;
}
int bitmapToGray(char *OriginalBMP,char *ResultBMP) // 這里是bitmapToGray函數的具體定義,相當於把這個函數具體做什麼一步一步寫出來。
{
unsigned char *BMP24Image,*BMP8Image;
BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
RGBQUAD Color[256];
BYTE CTemp[3]; //顏色分量
int Row,Col,nCol;
int i,j,k;
FILE *f,*p;
//上面的都是聲明變數,這些變數的申請速度很快,因為他們在棧上,這個空間一般有1M,讀寫速度都比較快,使用起來安全。

BMP24Image=(unsigned char*)calloc(2000*2000,sizeof(unsigned char));
BMP8Image=(unsigned char*)calloc(1000*1000,sizeof(unsigned char));
//上面是申請空間,這個空間是在堆上面,這個堆基本就是內存,和虛擬內存了,很大,但是會比較慢,而且管理起來比較復雜。

if((f=fopen(OriginalBMP,"rb"))==NULL)
{
printf("open %s error,please check\n");
return 0;
}
fread(&fh,sizeof(BITMAPFILEHEADER),1,f);
if(fh.bfType!='MB')
{
printf("This is not a BMP picture\n");
return 0;
}

fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+sizeof(RGBQUAD)*256;
fread(&ih,sizeof(BITMAPINFOHEADER),1,f);
Row=ih.biHeight;
Col=ih.biWidth;
Col=Col/4*4;
nCol=Col*4/4*4; //掃描寬度
ih.biBitCount=8; //改變像素位數大小,8位,256色
fread(BMP24Image,sizeof(unsigned char),Row*Col,f);
// 上面就是讀取BMP圖像

for(i=0;i<Row;i++)
{ for(j=0;j<Col;j++)
{
if(BMP24Image[i*Col+j]>128)
BMP8Image[i*Col+j]=255;

else BMP8Image[i*Col+j]=100;

// 上面是對BMP進行二值化處理

for(k=0;k<3;k++)
{
CTemp[k]=BMP24Image[i*nCol+j*3+k];
}
BMP8Image[i*Col+j]=CTemp[2]*0.299+CTemp[1]*0.587+CTemp[0]*0.114;//轉化公式
}
}
// 上面大概是空間轉換YUV到RGB
fclose(f);
if((p=fopen(ResultBMP,"wb"))==NULL)
{
printf("open savefile error\n");
return 0;
}
// 准備進行寫入操作

for(i=0;i<256;i++) //調色板

{
Color[i].rgbBlue=i;
Color[i].rgbGreen=i;
Color[i].rgbRed=i;
Color[i].rgbReserved=0;
}
// 灰度圖是從0~255,上面大概是進行灰度處理
fwrite(&fh,sizeof(BITMAPFILEHEADER),1,p);
fwrite(&ih,sizeof(BITMAPINFOHEADER),1,p);
fwrite(Color,sizeof(RGBQUAD),256,p);
fwrite(BMP8Image,sizeof(unsigned char),Row*Col,p);
fclose(p);
// 上面進行寫入操作,並且關閉
return 0;
}

❺ C語言里 灰度圖像怎麼轉換為二維數組

1、步驟大概這樣
第一步:讀取圖像數據到內存
第二步:讀取文件頭
第三步:讀取信息頭
第四步:讀取圖像矩陣到二維數組
2、常式:

FileName=fileDlg.GetFileName();
蘆枯FILE*fp=fopen(FileName,"rb");//二進制讀方式打開指定的圖像文件
fread(&FileHead,sizeof(BITMAPFILEHEADER),1,fp);//讀取文件頭,文件指針自動後移
fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,fp);//讀取信息頭,文件指針自動後移嘩改
//獲取圖像寬、高、每像素所佔位數等信息
bmpWidth=InfoHead.biWidth;
bmpHeight=InfoHead.biHeight;
//下面完成圖像數據向內存數組的存儲
ImageData=newunsignedchar*[bmpHeight];
if(InfoHead.biBitCount==24)
{
for(inti=0;i<bmpHeight;i++)
{
陪蘆洞ImageData[i]=newunsignedchar[(bmpWidth*3+3)/4*4];
}
for(intk=0;k<bmpHeight;k++)
{
for(intj=0;j<(bmpWidth*3+3)/4*4;j++)
{
fread(&ImageData[k][j],1,1,fp);//上面完成動態二維數組的申請,這里實際讀取圖像數據
}
}
fclose(fp);//關閉文件

❻ 怎麼用opencv獲取圖像灰度值(用C語言)

1、可以變成灰度圖也可以不變。這里假設你的圖像都是IPL_DEPTH_8U類型。

2、如果變成灰度圖,就是單通道圖像,獲取的就是每一個像素點的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s = cvGet2D(img, i, j); //其中i代表y軸(第i行)飢帶鄭,即height;j代表x軸(第j列),即width。
printf("gray value=%f\n",s.val[0]);

//方法二:使用直接訪問
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j]; //i和j的意義同上
printf("gray value=%d\n",val);
}
}

3、如果不變成灰度圖,就是3通道圖像,獲取的就是每一個像素點的BGR值,然後分別獲取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s=cvGet2D(img,i,j); //其中i代表y軸行扒(第i行),即height;j代表x軸(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); //注意是BGR順序

//方法二:使用直接訪問
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->爛頌nChannels + 0]; // B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]; // G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]; // R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal); //注意是BGR順序
}
}

熱點內容
配置文件ini如何寫 發布:2024-03-29 17:31:05 瀏覽:997
如何更改微信密碼修改 發布:2024-03-29 17:24:49 瀏覽:588
探影哪個配置性價比最高 發布:2024-03-29 17:24:08 瀏覽:485
phpmyadminlinux安裝 發布:2024-03-29 17:13:15 瀏覽:792
python中replace 發布:2024-03-29 17:08:17 瀏覽:652
mdb導入sql 發布:2024-03-29 17:07:36 瀏覽:128
java資料庫工具類 發布:2024-03-29 16:31:15 瀏覽:388
安卓機哪裡看型號 發布:2024-03-29 15:59:40 瀏覽:281
cad解壓錯誤 發布:2024-03-29 15:01:45 瀏覽:79
存儲指令集 發布:2024-03-29 14:39:27 瀏覽:649