二值化函数c语言实现 c语言赋值二进制

如何把BMP图片二值化?

bmp图像的二值化有很多种方法,最简单的就是阈值分割

在龙亭等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、做网站 网站设计制作按需求定制网站,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,龙亭网站建设费用合理。

当某像素值阈值

就置像素值为255

当某像素值阈值

就置像素值为0

这个时候还得确定你处理的bmp图像是多少bits的,一般情况下处理24位的居多,我这有一个用C语言写的图像二值化的程序,如果想要的话,把邮箱留一下,发给你。

0// void PictureBlackWhite(Uint32 memaddr) { Uint32 i=0,x,y,j,tmp; Uint8 yh,yl,cr,cb; for(i=0;i

/ *下面是一个代码的任何表达式处理的计算器程序* /

包括中/ / c语言的输入和输出函数处理

/ / ; stdlib.h中

包括的/ *数学库函数* /

包括中/ *字符串处理函数* /

/ /

定义MAX_SIZE 256 / /处理字符串的最大长度

枚举BOOL ;/ /定义枚举类型变量

类型定义结构tagOPERATE的{

双操作数;/ /定义操作

字符操作;/ /定义运算符(+ - * / ^)

}操作,LPOPERATE;

无效PostSrc(CHAR * SRC,LPOPERATE lpOperator );

IsDigit(字符);

ISP(字符CH);

诠释ICP(字符路);

定位(字符CH);

诠释getOperand(CHAR *,*镜头,双OPRD);

双重计算(LPOPERATE lpOperator,双X);

:无效SrcFunProc(字符* SRC);

:无效_Proc(字符* SRC);

静态字符运算符[] =( + - * / ^ / /定义字符的计算

静态诠释InPriority [] = ;/ /输入优先

静态诠释OutPriority [] = ;/ /输出优先

定位(字符CH)/ /字符的字符串表达式定位

{

INT I = 0;

为(i = 0;操作[I] ='\ 0';我+ +)

(操作[I] == CH)

回报我;

返回-1;

}

“INT(ISP字符CH)/ /输入表达式的优先级

{

('A' = CH)

/返回;

其他

返回InPriority [定位(CH)];

}

/

诠释ICP(字符路)/ /输出表达式的优先级

{

('A' = CH )

回报;

其他

回报OutPriority [定位(CH)];

}

无效_Proc(CHAR * SRC)/ /将输入的字符串表达式11堆栈保护

{

字符缓冲区[ MAX_SIZE];

的char * p = SRC * Q =缓冲区;

* Q + + = * p + +;

而( '\ 0'!= * P)

{

如果(' - '== * P '('== *(P-1)) / a

{

* Q + + = '0';

* Q + + =' - ';

p + +;

}

其他

* Q + + = * p + +;

}

a

* Q ='\ 0';

,缓冲的strcpy(SRC);

}

的无效SrcFunProc计算(CHAR * SRC)/ /处理的数学函数(SIN COS谭LN日志)

{

char缓冲区[MAX_SIZE]; /

的char * p = SRC,* Q =缓冲区;

而(* p ='\ 0')

{

BR /开关(P)

{

情况下,'S':/ / A代表的罪

* Q + + =' A';

P + = 3;

突破;

'C':/ / B代表的COS

* Q + + ='B';

P + = 3;

突破;

'E':/ / C代表的exp

* Q + + ='C';

P + = 3;

突破;

情况下,'L':

('N'== *(p +1))/ / D LN()

* Q + + ='D';

其他

* Q + + ='E'; / / E代表LG()

p + = 2;

突破;

情况下,'T':/ / F代表谭()

* Q + + =' F'

P + = 3;

突破;

默认:

* Q + + = * P + +;

突破;

}

}

* Q ='\ 0'; / a

使用strcpy(SRC),缓冲

}

无效PostSrc“(CHAR * SRC,LPOPERATE的lpOperator)/ /后缀遍历处理表达

{

的char * p = src中,Y;

LPOPERATE lpOptr = lpOperator;

字符栈[MAX_SIZE];

诠释顶级= -1;

双操作数;

整数偏移量= 0;

/栈[+ +顶部] ='#';

而('\ 0'!= * P)

{

(IsDigit(* p))

{

getOperand(P&偏移,操作数);

P + =偏移; / a

lpOptr - 操作数=操作数;

lpOptr - 运算符= 0;

lpOptr + +;

} BR /

其他

('X'== * P)

{

(lpOptr + +) - 操作='X';

p + +;

}

其他

('P'= * P)

{

lpOptr - 操作数= 3.14159266;

P + = 2;

lpOptr - 运算符= 0;

lpOptr + +;

}

其他

(')'= * P)

{

为(Y =堆栈顶部 - ]; Y!='(',Y =堆栈[顶部 - ])

的(lpOptr + +) - 运算符= Y;

p + +;

}

其他

BR / {

(Y =堆栈顶部 - ] ISP(Y) ICP(* P),Y =堆栈[顶部 - ])

(lpOptr + +) - 运算符= Y;

栈[+ +顶部] = Y;

栈[+ +顶部] = * p + +; / a

}

}

(top! = -1)

(lpOptr + +) - 操作堆栈[顶 - ];

}

诠释IsDigit的“(CHAR CH)/ /判断是否数字

{

(('0' = CH)| |'。'== CH)

返回TRUE;

返回FALSE;

}

诠释getOperand(CHAR *,*镜头,双OPRD)/ /操作数的字符串表达式

{

的char * p = S,CH = * + +;

双Z = 0,X = 0;

/整数位= 0;

整数点= FALSE;

同时(IsDigit(CH)== TRUE){

(CH =='。'){

(点== TRUE)

返回FALSE;

点= TRUE;

BR /}

其他{

(点== TRUE){

X * = 10;

X + = CH - '0';

位+ +;

}

其他{

? * = 10;

Z + = CH - '0';

}

}

CH = * + +;

}

同时(位 - 0)X / = 10;

Z + = X;

* OPRD = Z;

* LEN = S - P - 1;

返回TRUE;

}

双重计算(LPOPERATE lpOperator,双X)/ /字符串表达式运算处理

{

双协议栈[MAX_SIZE,Y1 ,Y2;

诠释TOP = -1;

LPOPERATE lpOptr = lpOperator;

栈[+ +顶部] = 0;

(lpOptr - 运算符!='#')

{

(lpOptr - 运算符)

栈[+ +顶部] =(lpOptr + +) - 操作数;

其他

('X'== lpOptr - 运算符)

BR / {

栈[+ +顶部] = X;

lpOptr + +;

}

其他

开关((lpOptr + +) - 运算符)

{

情况下,'+':/ /搜索+

Y1 =堆栈顶部 - ]

Y2 =堆栈[ - ];

栈[+ +顶部] = Y1 + Y2;

突破;

情况下,' - ':/ /需求 -

Y1 =栈[ - ];

Y2 =堆叠[TOP - ]

栈[+ +顶部] = Y2-Y1;

突破;

情况下,'*':/ /需求*

Y1 =栈顶 - ];

Y2 =堆栈[ - ];

栈[+ +顶部] = Y1 Y2;

突破;

情况下,'/':/ /需求/

Y1 =堆栈[顶部 - ];

Y2 =栈[ - ];

栈[+ +顶部] = y2/y1

突破;

BR /情况下,'^':/ /需求^

Y1 =堆栈顶部 -

Y2 =堆栈顶部 - ];

/栈[+ +顶部] = POW(Y2,Y1);

突破;

情况下,'A':/ /寻求罪(Y1)

Y1 =堆栈[ - ];

栈[+ +顶部] = SIN(Y1);

突破;

/情况下'B':/ /需求COS(Y1)

Y1 =堆栈[ - ];

栈[+ +顶部] = COS(Y1); BR /

突破;

情况下,'C':/ /寻求EXP(Y1)

Y1 =堆栈[ - ];

BR /栈+ +顶部] =

EXP(Y1);

突破;

情况下,'D':/ /需求日志(Y1)Y1 =堆栈[ - ];

栈[+ +顶部] = LOG(Y1);

突破;

情况下, 'E':/ /需求LOG10(Y1)

Y1 =堆栈[ - ];

栈[+ +页顶] = LOG10(Y1);

突破;

情况下,'F':/ /需求棕褐色(Y1)

Y1 =堆栈[ - ];

栈[+ +顶部] = TAN(Y1);

突破;

默认:

突破;

}

}

返回堆栈顶部;

}

无效的主要()

{

字符SRC [MAX_SIZE];

双D;

OPERATE postsrc [MAX_SIZE ]

的memset(SRC,0,MAX_SIZE);/ /初始化一个地址的内存地址的最高256最后返回src

printf的(“公式计算器 - 精确到小数点后6位\ n请输入任何表情开始进入退出来结束程序\ n常数pi = 3.14159266 \ n“);

scanf的(”%s“,SRC);

(STRCMP(SRC,“退出”))/ /输入字符串“跳槽”,如果相等则退出循环,否则继续处理的表达

{

_Proc(SRC);

SrcFunProc(SRC);

PostSrc(SRC,postsrc);

D =计算(postsrc 3.1415926);

printf的(“计算结果:%F \ N”,D);

memset的(SRC,MAX_SIZE,0);

/ scanf函数(“%s”时,SRC);}

}

图像二值化的OpenCV

OpenCV中有两个函数可以实现图片的二值化:

(1)cvThreshold( dst, dst,230 , 255, CV_THRESH_BINARY_INV);

(2)cvAdaptiveThreshold( dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 9, -10);

方法(1)是手动指定一个阈值,以此阈值来进行二值化处理。其中的第四个参数决定了该方法的结果:

threshold_type=CV_THRESH_BINARY:

dst(x,y) = max_value, if src(x,y)threshold 0, otherwise.

threshold_type=CV_THRESH_BINARY_INV:

dst(x,y) = 0, if src(x,y)threshold; dst(x,y) = max_value, otherwise.

threshold_type=CV_THRESH_TRUNC:

dst(x,y) = threshold, if src(x,y)threshold; dst(x,y) = src(x,y), otherwise.

threshold_type=CV_THRESH_TOZERO:

dst(x,y) = src(x,y), if (x,y)threshold ; dst(x,y) = 0, otherwise.

threshold_type=CV_THRESH_TOZERO_INV:

dst(x,y) = 0, if src(x,y)threshold ; dst(x,y) = src(x,y), otherwise.

值得一说的是threshold_type可以使用CV_THRESH_OTSU类型,这样该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起 作用。比如:cvThreshold( dst, dst,300 , 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);这种方法对于灰度直方图呈现二峰特征的图片处理起来效果很好。

方法(2)是一个自适应阈值二值化方法,通过设定最后两个参数来调整效果。


当前文章:二值化函数c语言实现 c语言赋值二进制
当前URL:http://hbruida.cn/article/dodhhjd.html