|
我用的5110来显示CCD采集的图像,不过是采集到黑线显示留白,白色赛道显示黑色,我想设置成黑线显示黑色,白色赛道不显示,这样方便提取中线的时候显示中线,不知道要怎么设置,求指导
附图和山外简单二值化的程序,不知道是不是改动这个代码,如果是,怎么改动?
/*!
* @brief 简单的一个二值化 算法(不稳定,仅测试)
* @since v5.0
*/
// diff_threshold 差分阈值 ,不同的角度,不同的环境而有所不同
//可根据 maxdif 最大差分值来配置,或者直接固定阈值
#define diff_threshold ((maxdif> 12) ? ((maxdif*80)/100) :10) // 差分阈值
//#define diff_threshold 10
#define safe_isolation 3
void bin(uint8 *bin,uint8 * img,uint8 * difimg,uint16 len,uint8 maxdif)
{
uint16 tmplen = len;
uint8 thldnum = 0; //阈值次数
uint8 thresholdimg;
uint8 tmpnum;
memset(bin,0xFF,len); //全部当作
while(tmplen--)
{
if((tmplen == 0)|| (tmplen > len))
{
return;
}
if(difimg[tmplen] > diff_threshold) //找到 差分阈值
{
thldnum++;
//寻找最大差分阈值
while(tmplen--)
{
if((tmplen == 0)|| (tmplen > len))
{
return;
}
if(difimg[tmplen] < difimg[tmplen+1] ) //tmplen+1 为最大阈值
{
break;
}
}
//tmplen + 1 是 差分最大值 ,切换到 颜色扫描
if((img[tmplen] <= img[tmplen+1]) ||(img[tmplen+1] <= img[tmplen+2]) ) // 前面 黑色 ,后面 白色
{
//选择 差分值最大值的前一个 作为 阈值
thresholdimg = (img[tmplen+1] + img[tmplen+2])/2;
//扫描下一个 高于 此阈值 (比此点更白)
while(img[tmplen] <= thresholdimg)
{
bin[tmplen] = 0; //黑色
tmplen--;
if(tmplen == 0) //结尾了 ,直接退出
{
if(img[tmplen] <= thresholdimg)
{
bin[tmplen] = 0; //黑色
}
return ;
}
else if (tmplen > len)
{
return;
}
}
tmplen -= safe_isolation;
if((tmplen == 0)|| (tmplen > len))
{
return;
}
//等待差分值降低
while(difimg[tmplen] > diff_threshold)
{
tmplen--;
if((tmplen == 0)|| (tmplen > len))
{
return;
}
}
}
else
{
//前白 后 黑
if(thldnum == 1)
{
//后面的 内容都是 黑色的
tmpnum = tmplen + 1;
while(tmpnum < len)
{
bin[tmpnum] = 0; //黑色
tmpnum ++;
}
}
}
}
}
}
|
|