当前位置:首页 » 编程语言 » 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顺序
}
}

热点内容
为什么微信扫码安卓手机很慢 发布:2024-11-05 01:58:01 浏览:534
SLSB算法 发布:2024-11-05 01:49:44 浏览:130
比安卓头子短一点的是什么数据线 发布:2024-11-05 01:43:53 浏览:534
c语言多选 发布:2024-11-05 01:41:31 浏览:302
c语言判断一个数是否是素数 发布:2024-11-05 01:36:32 浏览:833
虚拟页式存储 发布:2024-11-05 01:28:01 浏览:214
java比较炫的小程序 发布:2024-11-05 01:27:17 浏览:788
如何在ftp上开放执行权限 发布:2024-11-05 01:22:51 浏览:729
编程半径为5 发布:2024-11-05 01:22:43 浏览:290
linuxnetstatan命令 发布:2024-11-05 00:54:49 浏览:829