如何找BMP图像的黑白分界线 一幅768*576的BMP图像,其中有许多分界线,怎么样才能把这些分界线的像素点找到? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果分界线是由颜色值固定的象素组成则很容易找到了。根据位图的色深(8位,16位)来获取象素数组,然后遍历这个二维数组找到其RGB颜色接近分界线颜色的象素点就可以了。比如16位色的位图RGB的分别占5,6,5位,提取出来与分界色的RGB比较就可以了。为了比较接近的颜色,可以比较高位是否相等就可以了。比如比较高4位是否相等,R=11110和分界色的R=11111就很接近。int nW=100;//位图的宽int nH=100;//位图的高DWORD clr;//分界色DWORD pix;//位图中取出的点DWORD data[nW*nH];//16位色的位图象素数据nW*nH=100×100byte r,g,b;//r,g,b颜色分量byte r0,g0,b0;//分界色的颜色分量 r0=clr&0x001f;//取R分量,取5位,可以只取4位,或更少做模糊判断 g0=clr&0x07e0;//G,取中间6位,可以只取5位 b0=clr&0xf800;//B,取最后5位,可以只取4位for(int i=0;i<nH;i++){for(int j=0;j<nW;i++){ pix=data[i*j+j];//读取一个象素 r=pix&0x001f;//取R分量,可以只取4位 g=pix&0x07e0;//G,同上 b=pix&0xf800;//B,同上 if(r==r0&&g==g0&&b==b0) ;//ok,该点和分界色很接近,保存它的位置,以备使用}} to:ddmor(小明),分界线的RGB值是不确定的,而且是不可知的啊!还有其他方法吗? to:happy__888([顾问团]寻开心) 能告诉我怎样求阈值吗?我刚接触VC,所以小妹比较笨,望告知! 先转换为灰度图,然后统计灰度图,找出阈值otsu是一个很有效的求得阈值的算法 不知道你的图像是不是黑白分明呢?是的话好办,不是的话我想可以一个一个分析像素点,把他们的RGB值通过公式转化为H值,H好像是亮度之类的,忘了,比如某一点A转化后H = 123(并不一定是这样,有可能小数),然后像上边的大哥说的,设定域值,比如10,那么只要其它点的H值减去123的绝对值大于10,那么认为这个点和点A不是同一颜色,小于10就认为可以算一类颜色。说的不一定对,讨论讨论,这样的话也许能分界,嘿嘿 还是谈谈你的具体应用吧。找分界线是为了完成什么任务。对分界线的定义还不太清楚。比如从视觉上来比较,至少要满足和原图的对比反差很大吧,比如亮度,色阶,饱和度。那可以将RGB的颜色空间转换到HSL空间,然后找到反差大的颜色做为分界线。 楼上都说的差不多了补充一句:把你的r,g,b 三色的值加起来除以3就是灰度值了 我处理的图象就是8位、24位的BMP灰度图象啊!我现在就是不知道该怎么写代码啊! 查找边界有很多现成算法的,sobel算子之类,查查吧。 CPoint AB(BYTE CCDData[][768],RECT Range,int ThresholdValue,BOOL SingalMode,int ScanLineNum){ int i,j,m; int data[768]; int min,max; int YValue; BOOL flag=TRUE; int LineSum,num=10; CPoint Apex; Apex.y=0; Apex.x=0; LineSum=(Range.right-Range.left-1); YValue=Range.left; int DataTemp[576]; int DataMax,DataMin; DataMax=0; DataMin=255; for(i=0;i<576;i++) { DataTemp[i]=0; } YValue=Range.left; for(j=Range.left;j<Range.right;j++) { for(i=Range.top;i<Range.bottom;i++) { DataTemp[i]=DataTemp[i]+CCDData[i][YValue]; } YValue++; } for(i=Range.top;i<Range.bottom;i++) { DataTemp[i]=(int)(DataTemp[i]/(Range.right-Range.left)); if(DataTemp[i]>DataMax) DataMax=DataTemp[i]; if(DataTemp[i]<DataMin) DataMin=DataTemp[i]; } int FloatThresholdValue; FloatThresholdValue=(DataMax+DataMin)/2; YValue=Range.left; if(SingalMode==SINGAL_DRINK) { for(j=0;j<LineSum;j++) { data[j]=0; for(i=Range.top;i<Range.bottom;i++) { flag=TRUE; for(m=i;m<i+50;m++) { if(m>=Range.bottom) flag=FALSE; if(CCDData[m][YValue]>FloatThresholdValue) flag=FALSE; } if(flag) { data[j]=i; break; } } YValue++; } } else//SINGAL_LIGHT { for(j=0;j<LineSum;j++) { data[j]=0; for(i=Range.top;i<Range.bottom;i++) { flag=TRUE; for(m=i;m<i+50;m++) { if(CCDData[m][YValue]<FloatThresholdValue) flag=FALSE; } if(flag) { data[j]=i; break; } } YValue++; } } min=data[0]; max=data[0]; for(i=1;i<LineSum;i++) { if((data[i]-data[i-1])>3) continue; if(data[i]>max) { max=data[i]; Apex.y=max; Apex.x=i+Range.left; } } return Apex;}谁能告诉我这一段代码是什么意思,完成了什么功能?谢了! 互联网上任意两台主机连接通信的问题? 请问如何知道按钮被摁下了一段时间 包含了类的头文件,却仍然提示类没有定义错误/ 怎样增加一个支持UNICODE的工程设置 关于最小化的问题? 数1000张图的显示问题。哈。哈。哈。在哈哈哈在在 高手请进,VC的MDI容器嵌入Excel后的打印预览问题 望不吝指教! 写一个组件要求返回一个客户Recordset 并且这个Recordset可以在ASP中得到! 大家帮个忙!! 有人编过控制面板小程序吗?几个问题不太明白 如何写B/S结构系统
根据位图的色深(8位,16位)来获取象素数组,然后遍历这个二维数组找到其RGB颜色接近分界线颜色的象素点就可以了。
比如16位色的位图RGB的分别占5,6,5位,提取出来与分界色的RGB比较就可以了。为了比较接近的颜色,可以比较高位是否相等就可以了。比如比较高4位是否相等,R=11110和分界色的R=11111就很接近。
int nW=100;//位图的宽
int nH=100;//位图的高
DWORD clr;//分界色
DWORD pix;//位图中取出的点
DWORD data[nW*nH];//16位色的位图象素数据nW*nH=100×100
byte r,g,b;//r,g,b颜色分量
byte r0,g0,b0;//分界色的颜色分量
r0=clr&0x001f;//取R分量,取5位,可以只取4位,或更少做模糊判断
g0=clr&0x07e0;//G,取中间6位,可以只取5位
b0=clr&0xf800;//B,取最后5位,可以只取4位
for(int i=0;i<nH;i++)
{
for(int j=0;j<nW;i++)
{
pix=data[i*j+j];//读取一个象素
r=pix&0x001f;//取R分量,可以只取4位
g=pix&0x07e0;//G,同上
b=pix&0xf800;//B,同上
if(r==r0&&g==g0&&b==b0)
;//ok,该点和分界色很接近,保存它的位置,以备使用
}
}
otsu是一个很有效的求得阈值的算法
对分界线的定义还不太清楚。比如从视觉上来比较,至少要满足和原图的对比反差很大吧,比如亮度,色阶,饱和度。那可以将RGB的颜色空间转换到HSL空间,然后找到反差大的颜色做为分界线。
补充一句:把你的r,g,b 三色的值加起来除以3就是灰度值了
{
int i,j,m;
int data[768];
int min,max;
int YValue;
BOOL flag=TRUE;
int LineSum,num=10; CPoint Apex; Apex.y=0;
Apex.x=0; LineSum=(Range.right-Range.left-1);
YValue=Range.left; int DataTemp[576]; int DataMax,DataMin;
DataMax=0;
DataMin=255; for(i=0;i<576;i++)
{
DataTemp[i]=0;
} YValue=Range.left; for(j=Range.left;j<Range.right;j++)
{
for(i=Range.top;i<Range.bottom;i++)
{
DataTemp[i]=DataTemp[i]+CCDData[i][YValue];
}
YValue++;
} for(i=Range.top;i<Range.bottom;i++)
{
DataTemp[i]=(int)(DataTemp[i]/(Range.right-Range.left)); if(DataTemp[i]>DataMax)
DataMax=DataTemp[i];
if(DataTemp[i]<DataMin)
DataMin=DataTemp[i];
} int FloatThresholdValue;
FloatThresholdValue=(DataMax+DataMin)/2; YValue=Range.left; if(SingalMode==SINGAL_DRINK)
{
for(j=0;j<LineSum;j++)
{
data[j]=0;
for(i=Range.top;i<Range.bottom;i++)
{
flag=TRUE;
for(m=i;m<i+50;m++)
{
if(m>=Range.bottom)
flag=FALSE;
if(CCDData[m][YValue]>FloatThresholdValue)
flag=FALSE;
}
if(flag)
{
data[j]=i;
break;
}
}
YValue++;
}
}
else//SINGAL_LIGHT
{
for(j=0;j<LineSum;j++)
{
data[j]=0;
for(i=Range.top;i<Range.bottom;i++)
{
flag=TRUE;
for(m=i;m<i+50;m++)
{
if(CCDData[m][YValue]<FloatThresholdValue)
flag=FALSE;
}
if(flag)
{
data[j]=i;
break;
}
}
YValue++;
}
} min=data[0];
max=data[0]; for(i=1;i<LineSum;i++)
{
if((data[i]-data[i-1])>3)
continue; if(data[i]>max)
{
max=data[i];
Apex.y=max;
Apex.x=i+Range.left;
}
} return Apex;
}谁能告诉我这一段代码是什么意思,完成了什么功能?谢了!