




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/* * 该函数用于对图像进行阈值分割运算 * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) */ BOOL ImageChangeProc:ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight) / 指向源图像的指针 LPSTR lpSrc; / 指向缓存图像的指针 LPSTR lpDst; / 指向缓存DIB图像的指针 LPSTR lpNewDIBBits; HLOCAL hNewDIBBits; /循环变量 long i; long j; unsigned char pixel; long lHistogram256; /阈值,最大灰度值与最小灰度值,两个区域的平均灰度值 unsigned char Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue; /用于计算区域灰度平均值的中间变量 long lP1,lP2,lS1,lS2; /迭代次数 int IterationTimes; LONG lLineBytes; hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight); if (hNewDIBBits = NULL) / 分配内存失败 return FALSE; / 锁定内存 lpNewDIBBits = (char * )LocalLock(hNewDIBBits); / 初始化新分配的内存 lpDst = (char *)lpNewDIBBits; memset(lpDst, (BYTE)255, lWidth * lHeight); lLineBytes = WIDTHBYTES(lWidth * 8); for (i = 0; i 256;i+) lHistogrami=0; /获得直方图 MaxGrayValue = 0; MinGrayValue = 255; for (i = 0;i lWidth ;i+) for(j = 0;j pixel) MinGrayValue = pixel; if(MaxGrayValue pixel) MaxGrayValue = pixel; /迭代求最佳阈值 NewThreshold = (MinGrayValue + MaxGrayValue)/2; Threshold = 0; for(IterationTimes = 0; Threshold != NewThreshold & IterationTimes 1000;IterationTimes +) Threshold = NewThreshold; lP1 =0; lP2 =0; lS1 = 0; lS2 = 0; /求两个区域的灰度平均值 for (i = MinGrayValue;i =Threshold;i+) lP1 += lHistogrami*i; lS1 += lHistogrami; for (i = Threshold+1;iMaxGrayValue;i+) lP2 += lHistogrami*i; lS2 += lHistogrami; if(lS1=0|lS2=0) / 释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); return FALSE; Temp1GrayValue = (unsigned char)(lP1 / lS1); Temp2GrayValue = (unsigned char)(lP2 / lS2); NewThreshold = (Temp1GrayValue + Temp2GrayValue)/2; /根据阈值将图像二值化 for (i = 0;i lWidth ;i+) for(j = 0;j lHeight ;j+) lpSrc = (char *)lpDIBBits + lLineBytes * j + i; lpDst = (char *)lpNewDIBBits + lLineBytes * j + i; pixel = (unsigned char)*lpSrc; if(pixel = Threshold) *lpDst = (unsigned char)0; else *lpDst = (unsigned char)255; / 复制图像 memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight); / 释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); / 返回 return TRUE; #include #include #include #pragma pack(1)#define R 30#define G 59#define B 11#define ONE 255 #define ZERO 0 typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;typedef unsigned char BYTE;typedef struct tagBITMAPFILEHEADER / bmfh WORD bfType; / 位图文件的类型,必须为BM DWORD bfSize; / 位图文件的大小,以字节为单位 WORD bfReserved1; / 位图文件保留字,必须为0 WORD bfReserved2; / 位图文件保留字,必须为0 DWORD bfOffBits; / 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER / bmih DWORD biSize; / 本结构所占用字节数 LONG biWidth; / 位图的宽度,以像素为单位 LONG biHeight; / 位图的高度,以像素为单位 WORD biPlanes; / 目标设备的级别,必须为1 WORD biBitCount;/ 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; / 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; / 位图的大小,以字节为单位 LONG biXPelsPerMeter; / 位图水平分辨率,每米像素数 LONG biYPelsPerMeter; / 位图垂直分辨率,每米像素数 DWORD biClrUsed;/ 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;/ 位图显示过程中重要的颜色数 BITMAPINFOHEADER; typedef struct tagPOINT BYTE b; BYTE g; BYTE r; POINT;int quit();int quit() puts(Files format wrong); exit(0);void main (int argc,char *argv) FILE *fi,*fo;/I/O file char fin80,fon80;/I/O file name BYTE buff,o=0; BITMAPFILEHEADER bf; BITMAPINFOHEADER bi; POINT *p; int i,j,t; if(argc3) printf(orginfile name:); scanf(%s,fin); printf(resultfile name:); scanf(%s,fon); else sscanf(argv1,%s,fin); sscanf(argv2,%s,fon); if(argc=4) sscanf(argv4,%d,&t); else printf(theshold 0,255:); scanf(%d,&t); if (fi=fopen(fin,rb)=NULL)|(fo=fopen(fon,wb)=NULL) puts(nfile open failed); return; fread(&bf,sizeof(bf),1,fi); fread(&bi,sizeof(bi),1,fi); if(bf.bfType!=0x4d42) quit(); if(bf.bfReserved1!=0x0000) quit(); if(bf.bfReserved2!=0x0000) quit(); if(bi.biClrImportant!=0) quit(); if(bi.biBitCount!=0x18) quit(); if(bi.biCompression!=0) quit(); if(bi.biPlanes!=1) quit(); bf.bfSize=54+1024+bi.biWidth*bi.biHeight; bf.bfOffBits=54+1024; if(bi.biWidth%4=0) bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8; else bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8; bi.biBitCount=8; p=(POINT *)malloc(sizeof(POINT *)*bi.biHeight); for (i=0;ibi.biHeight;i+) *(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth); /分配失败后果自负! fwrite(&bf,sizeof(bf),1,fo); fwrite(&bi,sizeof(bi),1,fo); for (i=0;ibi.biHeight;i+) for (j=0;jbi.biWidth;j+) fread(*(p+i)+j,sizeof(POINT),1,fi); for (i=0x00,buff=0x00;i=0xFF;i+,buff+) fwrite(&buff,sizeof(buff),1,fo); fwrite(&buff,sizeof(buff),1,fo); fwrite(&buff,sizeof(buff),1,fo); fwrite(&o,sizeof(o),1,fo); for (i=0;ibi.biHeight;i+) for (j=0;jr*R+(*(p+i)+j)-g*G+(*(p+i)+j)-b*B)/100; buff=(buff=t?ONE:ZERO) fwrite(&buff,sizeof(buff),1,fo); fclose(fo); 怎样用c语言读入一个图片文件,为了进行二值化等一些列的处理? 检举|2010-12-19 09:38 提问者: wangw899|浏览次数:1013次我来帮他解答 满意回答检举| 2010-12-20 17:11#include #include #include #pragma pack(1)#define R 30#define G 59#define B 11#define ONE 255 #define ZERO 0 typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;typedef unsigned char BYTE;typedef struct tagBITMAPFILEHEADER / bmfh WORD bfType; / 位图文件的类型,必须为BM DWORD bfSize; / 位图文件的大小,以字节为单位 WORD bfReserved1; / 位图文件保留字,必须为0 WORD bfReserved2; / 位图文件保留字,必须为0 DWORD bfOffBits; / 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER / bmih DWORD biSize; / 本结构所占用字节数 LONG biWidth; / 位图的宽度,以像素为单位 LONG biHeight; / 位图的高度,以像素为单位 WORD biPlanes; / 目标设备的级别,必须为1 WORD biBitCount;/ 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; / 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; / 位图的大小,以字节为单位 LONG biXPelsPerMeter; / 位图水平分辨率,每米像素数 LONG biYPelsPerMeter; / 位图垂直分辨率,每米像素数 DWORD biClrUsed;/ 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;/ 位图显示过程中重要的颜色数 BITMAPINFOHEADER; typedef struct tagPOINT BYTE b; BYTE g; BYTE r; POINT;int quit();int quit() puts(Files format wrong); exit(0);void main (int argc,char *argv) FILE *fi,*fo;/I/O file char fin80,fon80;/I/O file name BYTE buff,o=0; BITMAPFILEHEADER bf; BITMAPINFOHEADER bi; POINT *p; int i,j,t; if(argc3) printf(orginfile name:); scanf(%s,fin); printf(resultfile name:); scanf(%s,fon); else sscanf(argv1,%s,fin); sscanf(argv2,%s,fon); if(argc=4) sscanf(argv4,%d,&t); else printf(theshold 0,255:); scanf(%d,&t); if (fi=fopen(fin,rb)=NULL)|(fo=fopen(fon,wb)=NULL) puts(nfile open failed); return; fread(&bf,sizeof(bf),1,fi); fread(&bi,sizeof(bi),1,fi); if(bf.bfType!=0x4d42) quit(); if(bf.bfReserved1!=0x0000) quit(); if(bf.bfReserved2!=0x0000) quit(); if(bi.biClrImportant!=0) quit(); if(bi.biBitCount!=0x18) quit(); if(bi.biCompression!=0) quit(); if(bi.biPlanes!=1) quit(); bf.bfSize=54+1024+bi.biWidth*bi.biHeight; bf.bfOffBits=54+1024; if(bi.biWidth%4=0) bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8; else bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8; bi.biBitCount=8; p=(POINT *)malloc(sizeof(POINT *)*bi.biHeight); for (i=0;ibi.biHeight;i+) *(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth); /分配失败后果自负! fwrite(&bf,sizeof(bf),1,fo); fwrite(&bi,sizeof(bi),1,fo); for (i=0;ibi.biHeight;i+) for (j=0;jbi.biWidth;j+) fread(*(p+i)+j,sizeof(POINT),1,fi); for (i=0x00,buff=0x00;i=0xFF;i+,buff+) fwrite(&buff,sizeof(buff),1,fo); fwrite(&buff,sizeof(buff),1,fo); fwrite(&buff,sizeof(buff),1,fo); fwrite(&o,sizeof(o),1,fo); for (i=0;ibi.biHeight;i+) for (j=0;jr*R+(*(p+i)+j)-g*G+(*(p+i)+j)-b*B)/100; buff=(buff=t?ONE:ZERO) fwrite(&buff,sizeof(buff),1,fo); fclose(fo); #include #include #include #include #include #include #include typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;#define SIZE 40#pragma pack(push)#pragma pack(1)/*定义位图文件头*/typedef structWORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits; BIT_MAP_FILE_HEADER;/*定义信息头*/typedef structDWORD biSize;DWORD biWidth;DWORD biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;DWORD biXPelsPerMeter;DWORD biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant; BIT_MAP_INFO_HEADER;/*调色板*/typedef structBYTE blue;BYTE green;BYTE red; RGB_QUAD;#pragma pack(pop)int odd_or_even(int x)if(x%2) != 0)return 1;elsereturn -1;int main()RGB_QUAD *bmp_data = NULL;FILE *bmp_file;int i, j, k, q;long width = 400; /设置图片宽度long height = 400; /设置图片高度long date_size = width*height;BIT_MAP_FILE_HEADER bmp_map_file;BIT_MAP_INFO_HEADER bmp_map_info;if(bmp_file=fopen(cubs.bmp, wb+) = NULL)printf(Error!n);system(pause);exit(0);/*写入图位文件头*/bmp_map_file.bfType = 0x4d42;bmp_map_file.bfSize = 14 + 40 + width * height * 3;bmp_map_file.bfReserved1 = 0;bmp_map_file.bfReserved2 = 0;bmp_map_file.bfOffBits = 0x3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论