当前位置:首页 » 编程语言 » 用c语言调节照片的灰度
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言调节照片的灰度

发布时间: 2022-10-03 02:05:32

Ⅰ 如何用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)];
}