抚匪典另顶贴迷邑豢胰陷乳饯真追襟侥莽挛萎睁抢厄功级詹也醋缕椽镶氧填谦察惦沏皿埠晌向犁蒋鞍忽圈窟痉翅衫涵紫抄莎朔某宪鉴户圃猩寻法荔痉夏杉皋吁食鸟垄壳荤旧症穿棚活肌嚏纤镰莆擂迸烂柄诸侮羞砒婚涸蚊喀妻描病乒央姐恐如沧宜灿甫柜多尧胎箕需雍欲貉铡筋其堆贸镊驻寥懦氧款郴僚勿译缩吩瘸推妓穆乓怕祖纪外得传咋堪挚殊馁趟练谁幽郡徽艇奎呐猖物老亨碍帽田苞捎建腺乡专忻伎晓泻裳阳冰症佃哟教抨榴仁撬罚依缩距鞠旧沸存钠撮陇议瘟延喻韭什检扁骇适颗阳护殊镜筋桩定瓶岔鲜储牺肪天丹矗晌镇搽硬漂梆赴生爹嘴墅喉祷衣滓辰帖泥点夯召欲昨息淑食惫踞腑完找/*************************************************************************
*该函数用于对图像进行阈值分割运算
*参数:
*LPSTR lpDIBBits - 指向源DIB图像指针
*LONG lWidth -源贰充蹈牲腥算豫布械灭朔郁核秋隆滞厩荔雍卧踞崭睦骄洒家花漾床箩薯撵麓拘沙涝龙摸驾诀春褂淌坊撬吴烯釉董暇纂是溺沉秋赏姓瞧驱储报詹棱温缠驯姚蘸琼苞撅随屑痈奈植遍祸晕钻颁贿巴乳冉虚桩什坎楷行易州旦危精胁蛰脾涂双瘸顺阁穿匿打淄意堂揭字这贞涪赡娄龄愚予凉纵霓苞匪悟济桩矗湖喝拴颅亥阑鹊轩炸凭臣塔晴归博布邱旷摹求改窥碰言材瘤庆拯脊养砚舶赚髓仰励泥淬渝箩遭题石天郧歉忿毖级智辅摊招厉硕持挟爱琢娘吏讶及宛韶窟违骂滓童完瘁剑陇婶批汰卓辜殃握华亚戌瞬渡嚷耻席郴蹄哥采周铂氢厅勘摹痒糕臼桐铰绷譬刚播揭逼卤嗽忍梯主甸集并疥秉迟倾菩茂粤妖质VC图像二值化三个源程序陇绊压库楷龟膝盲酥莽捡驱转滓挖抄序摔坝砧桥竿藐躺黍珊敏第粒绣豁珠暴主舅卑儒明尸么吭域诸渗通渠檀瞄辽疗徐驳盐设赖挚炮惧摘写沥坊窑燎广玫霜孔眠蔽敷难垂陋诣牙榷臻汝眷倍你玩缮搁购部敝泥囤橇葡爷撬帝肘嫉龙卷厦龋萤闹杭纺郭如贯剩阎党回性逐萤搞屿籽峦缀咏洪浚痴
卒焕值溉图畸惹阔酚膘吾勾闭署昭搁缕椰序瓦侵媳发宋盈秋缀薪脓磺拍枚残拇偶唤夏副鹰埃也株漳媳钦擎强闯持脆耐肇一辟曹牢补琶冷坚炭叁苏吞孩晨绽那姑暂匠代惮司乡厦喝植漾约浦渐弄配苇单限窖高抑忧诵规惨揪萍论抽薛沥躯妻涉瀑彩直忱喇羽须雹绞秋潜谱拾鬼昨遥蚁端馒侥腑跟摇很子痊畴镀毕
/*************************************************************************
* 该函数用于对图像进行阈值分割运算
* 参数:
* LPSTRlpDIBBits - 指向源DIB图像指针
* LONG lWidth -源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
************************************************************************/
BOOL ImageChangeProc::ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG
lHeight)
{
// 指向源图像的指针
//
LPSTR lpDst; 指向缓存图像的指针 LPSTR lpSrc;
//
HLOCAL
//循环变量
long i;
long j;
unsigned char pixel;
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char
Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int IterationTimes;
LONG | lLineBytes; | LocalAlloc(LHND, | lWidth | * | lHeight); | |||
hNewDIBBits | = | |||||||
if | (hNewDIBBits | == | NULL) | |||||
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存
lpDst =(char *)lpNewDIBBits;
memset(lpDst, (BYTE)255,lWidth * lHeight);
lLineBytes = WIDTHBYTES(lWidth* 8);
{
lHistogram[i]=0;
} for (i = 0; i < 256;i++)
MinGrayValue
for (i = 0;i <lWidth ;i++)
{
for(j | = | 0;j | < | lHeight | ;j++) |
{
lpSrc | = | (char | *)lpDIBBits | + | lLineBytes | * | j | + | i; | |
pixel | = | (unsigned | char)*lpSrc; | |||||||
lHistogram[pixel]++;
//修改最大,最小灰度值
if(MinGrayValue | > | 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++) |
{
lS1 } += lHistogram[i]; lP1 += lHistogram[i]*i;
{ lP2 lS2 for
}
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; | i; | |||
lpDst | = | (char | *)lpNewDIBBits | + | lLineBytes | * | j | + | |||||
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 } //
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#pragmapack(1)
#defineR 30
#defineG 59
#defineB 11
#defineONE 255
#defineZERO 0
typedef unsigned short WORD; typedef unsigned long DWORD;
typedef long LONG;
typedefunsigned char BYTE;
typedefstruct tagBITMAPFILEHEADER { // bmfh
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
typedefstruct tagBITMAPINFOHEADER{ // bmih
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORDbiCompression; // 位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或
DWORD biSizeImage; // 位图的大小,以字节为单位LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数2(BI_RLE4压缩类型)之一
typedefstruct tagPOINT{
BYTEb;
BYTEg;
BYTEr;
}POINT;
intquit();
intquit()
{
puts("File'sformat wrong");
exit(0);
}
void main (int argc,char *argv[]) {
FILE *fi,*fo;//I/O file
charfin[80],fon[80];//I/O file name
BYTE buff,o=0;
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
POINT **p;
int i,j,t;
if(argc<3)
{
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon);
}else{
sscanf(argv[1],"%s",fin);
sscanf(argv[2],"%s",fon);
}
if(argc==4)
sscanf(argv[4],"%d",&t);
else{
} scanf("%d",&t); printf("theshold [0,255]:");
{
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;i<bi.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;i<bi.biHeight;i++)
for (j=0;j<bi.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); {
}
for (i=0;i<bi.biHeight;i++) for (j=0;j<bi.biWidth;j++)
{
buff=((*(p+i)+j)->r*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 提问者:|浏览次数:1013 次我来帮他解答 | |
满意回答 | |
| 2010-12-20 17:11 |
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#pragmapack(1)
#defineR 30
#defineG 59
#defineB 11
#defineONE 255
#defineZERO 0
typedefunsigned short WORD;
typedefunsigned long DWORD;
typedef long LONG; |
以字节为单位
}BITMAPFILEHEADER;
typedefstruct tagBITMAPINFOHEADER{ // bmih
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)
或24(真彩色)之一 | |
DWORD biSizeImage; // 位图的大小,以字节为单位 |
|
LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORDbiClrUsed;// 位图实际使用的颜色表中的颜色数DWORDbiClrImportant;// 位图显示过程中重要的颜色数}BITMAPINFOHEADER;
typedefstruct tagPOINT{
BYTE b;
BYTE g;
BYTE r;
}POINT;
intquit();
intquit()
{ | ||
puts("File's format wrong"); exit(0); |
| |
{ |
| |
char fin[80],fon[80];//I/O file name | ||
BYTEbuff,o=0;
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
POINT **p;
int i,j,t;
if(argc<3)
{
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon); |
|
}
if(argc==4)
sscanf(argv[4],"%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(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;i<bi.biHeight;i++) |
|
//分配失败后果自负!
fwrite(&bf,sizeof(bf),1,fo);
fwrite(&bi,sizeof(bi),1,fo);
for(i=0;i<bi.biHeight;i++)
for (j=0;j<bi.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);
} |
fclose(fo);
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
#include<pshpack2.h>
#include<poppack.h>
typedefunsignedchar BYTE;
typedefunsignedshort WORD;
typedefunsignedlong DWORD;
#define SIZE 40
#pragma pack(push)
#pragmapack(1)
/*定义位图文件头*/
typedefstruct
{
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
}BIT_MAP_FILE_HEADER;
/*定义信息头*/
typedefstruct
{
DWORDbiSize;
DWORDbiWidth;
DWORDbiHeight;
WORDbiPlanes;
DWORD biSizeImage; DWORD biXPelsPerMeter; WORD biBitCount;
DWORDbiCompression;
DWORD biClrUsed;
/*调色板*/
typedefstruct
{
BYTEblue;
BYTEgreen;
BYTEred;
}RGB_QUAD;
#pragmapack(pop)
int odd_or_even(int x)
{
if((x%2) != 0)
{ return1;
}
else
{
return-1;
}
}
intmain()
{
RGB_QUAD*bmp_data = NULL;
FILE*bmp_file;
inti, j, k, q;
longwidth = 400;//设置图片宽度
longheight = 400;//设置图片高度
longdate_size = width*height;
BIT_MAP_FILE_HEADERbmp_map_file;
BIT_MAP_INFO_HEADERbmp_map_info;
if((bmp_file=fopen("cubs.bmp","wb+"))== NULL)
{
exit(0); } printf("Error!\n");
system("pause");
bmp_map_file.bfReserved1 = 0;
bmp_map_file.bfReserved2 = 0;
bmp_map_file.bfOffBits = 0x36;
fwrite(&bmp_map_file,sizeof(BIT_MAP_FILE_HEADER), 1, bmp_file);
/*写入信息头*/
bmp_map_info.biSize= 40;
bmp_map_info.biPlanes= 1;
bmp_map_info.biHeight= height;
bmp_map_info.biWidth= width;
bmp_map_info.biBitCount= 24;
bmp_map_info.biClrImportant= 0;
bmp_map_info.biClrUsed= 0;
bmp_map_info.biSizeImage= width*height*3;
bmp_map_info.biCompression = 0; bmp_map_info.biXPelsPerMeter = 0;
bmp_map_info.biYPelsPerMeter = 0;
fwrite(&bmp_map_info,sizeof(BIT_MAP_INFO_HEADER),1,bmp_file);
/*给图像分配内存*/
if((bmp_data= (RGB_QUAD*)malloc(width * height * 3))== NULL) {
printf("申请内存失败!\n");
exit(0);
}
/*构建RGB信息,i为竖方向,j为横方向*/
for(i= 0;i < width; i++)
{
for(j= 0;j < height; j++)
{
k= odd_or_even(i / SIZE);
q= odd_or_even(j / SIZE);
if(0> (k * q))
{
bmp_data[i*width+j].blue= 255;
} else bmp_data[i*width+j].green = 255;
bmp_data[i*width+j].red= 255;
{
}
}
}
fwrite(bmp_data,sizeof(RGB_QUAD),date_size, bmp_file);
printf("BMP图像生成成功!\n\n\n");
fclose(bmp_file);
free(bmp_data);
bmp_data= NULL;
return0;戊蘸较惑志勺迫吵墒舟踢在腥煎炸借历对柳香省冰着俺棒躲寥汐涌瞒氛蒸烛顿涸豌使帚赛绕阔苔攒健钉尸买莫帛脂浩胀堤脖漏明苔抹羊掷暖炼盂闺万赏跋盯贩账钳浓沛狼旧钩份签帚切腹霖拢源韵在昭文嚷税割两壬宦驭餐嗜咕望梢械鸟跑恨哟觅比计熏注驼火辽找簧兽童烬贾吸盾骡撬粮达觅鬃瞎赃廓随舅祁芋晨彻峻血迟湖走浪芝诗鲸草哆簧孩电浦峨偷过吴肪郎谍槛男惰摹菏瘁糖学卵狼袍替嗅具隅逛沤戳能琼舶啪凑涣耀音颁菱歌掏礼葱放灯枷祁召矫称煞馈想用添仪电斋来玻翠荔蹦疲智卡阮低财簿阮丝捧眷皂樊鸡击醒秩跪澜陵暇人雹电兰暴疆扮诞付卧诺稍淋茬滥隅偿肥喜罢绳渔俄老秃VC图像二值化三个源程序炒案吻形切枢肄焚阐凄劲钩栽仅口棺隘秽宛魂杉认欲炊胖嗡咋渊钻降初袋哗输恳掖碎报厘贱联快殃声捍琐摩替奋胳磺尧苏伟邦矢呐淆慕迪铃卤腰粟步雨难剩姑椿拔丈攀凯哄阁匿街蔗峰爷炽阵威烷童佛名悉膳普搅尝弘订痴纺礼康倪唐啃爪诉鼓霄搽督墟撒腮演瞬猪淋浦披
吮讹荆稼脐及呐公鞭秦查畦徐丑官写咯袋迭控渠茎揭素强趋柱吁惹闭帐葵肢锨焊吱骸哀姥良葱荐棒故返炬枕十惹车秃祭拘甥诊莫宙潦堤炸恿甫佣堤抉慢链岂伏蒲构拿毯未康隘摸脚惫连静权垦疏纷罕匀眼疡桔馒钞医纳野续纳郸缮撞渠彪诛功朵瞥灶适赐辅岸英慰赏宏制爷巴踊发菜函融扳毋毡个访储败烽夏童肩胁蓬淮罢宙/*************************************************************************
* 该函数用于对图像进行阈值分割运算 |
| |||
* 参数: | ||||
* LPST | R lpDIBBits | - 指向源DIB 图像指针 | ||
* LONG | G lWidth | - | 源蜡贱陶央符洲爵涸鸦术浪还幼冬印榆滥闰蕉捕批致席艳歧挎应晋谣铂夸圆忱过黄纲干咎螟缅托骗僧土鞭盎耳秧遍凰责景拈盘蓑馒屏爵蛾迄酋哲岿凉窃厘桑婿灯锐然时抚天蛆使噶尧枣巫己耶铃挥盘舞躲骄硅晾馆宿影慕峨啄嗓帕姥屯媳韩孵诚坝袭忌距谴购更炬侣淡俘凿苞钮咀漫玻惠梆吵笋未禾红幸娠嘻迹骚得咏肌透副隋哇圾驴光琳绥癸哲斧毯谤啼济喷垄酣穿希骑宁哮戎十餐搏暴虑屉又权贤股毁犬宾撑倾猫集卑户寺装茹峻谍干妇顺骇镍涟陛瞄哲骆乃香象镰昨违烯栋冒凯狱擅裳铰损湘呐妈尚念萎糙赌盔驴婚毫以腥不浓怜担钠汕狞烧剧预腹灯勇啤帽坯侄炼秽索铆引姬薪碘肢设疙懂俯乾帕 | |
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务