bmp图像的二值化有很多种方法,最简单的就是阈值分割
在龙亭等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、做网站 网站设计制作按需求定制网站,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,龙亭网站建设费用合理。
当某像素值阈值
就置像素值为255
当某像素值阈值
就置像素值为0
这个时候还得确定你处理的bmp图像是多少bits的,一般情况下处理24位的居多,我这有一个用C语言写的图像二值化的程序,如果想要的话,把邮箱留一下,发给你。
/ *下面是一个代码的任何表达式处理的计算器程序* /
包括中/ / 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中有两个函数可以实现图片的二值化:
(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)是一个自适应阈值二值化方法,通过设定最后两个参数来调整效果。