CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

对于一幅图象的前景,背景如何做出正确的判断??

楼主oysoysoys(野比)2005-01-23 12:51:10 在 VC/MFC / 图形处理/算法 提问

搞图象处理时,我要识别图象上的字符,如果二值化后   计算就分不清哪个是背景哪个是要处理的字符而我后面对图象进行的操作都是规定好的背景是255,字符是1来表示的,  
  大家帮我想想咋样在图象还没被处理前,进行正确的判断 问题点数:100、回复次数:28Top

1 楼oysoysoys(野比)回复于 2005-01-23 12:52:28 得分 0

先upupup一下Top

2 楼I_Love_CPP(Never stop!)回复于 2005-01-23 14:21:11 得分 80

"规定好的背景是255,字符是1来表示的"  
   
  什么意思?   255、1   表示灰度值???Top

3 楼oysoysoys(野比)回复于 2005-01-23 14:38:44 得分 0

sorry  
  打错拉。应该是  
  规定好的背景是255,字符是0来表示的"Top

4 楼I_Love_CPP(Never stop!)回复于 2005-01-23 14:47:38 得分 0

"规定好的背景是255,字符是0来表示的"  
   
  怎么会分不清呢?颜色都不一样!  
  你究竟想问什么?Top

5 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2005-01-23 14:56:11 得分 5

关注  
   
  如果一个图片,上半部分黑色,下半部分红色.那黑色是背景色,还是红色是背景色啊?Top

6 楼I_Love_CPP(Never stop!)回复于 2005-01-23 15:12:29 得分 0

"如果二值化后   计算就分不清哪个是背景哪个是要处理的字符"  
  "大家帮我想想咋样在图象还没被处理前,进行正确的判断"  
   
  如果你在字符识别之前就能判断出谁是背景谁是字符,  
  那还要你识别干吗?!  
   
  字符识别属于模式识别,模式识别有很多种方法(或者说很多流派);  
  而具体到字符识别,最简单的方法是利用灰度/色彩信息进行阈值分割。  
   
   
   
  Top

7 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2005-01-23 15:24:09 得分 0

什么叫二值化  
  学习   先谢了!  
  楼主别生气,小弟借宝地一用.Top

8 楼oysoysoys(野比)回复于 2005-01-23 18:21:39 得分 0

我难道没说清楚吗?  
  我仔细说一下吧:  
  我对某一张图象,二直化后   可能   背景是255,字符是0(当然这是人眼看出来的)  
  如果又对另外一张的图象,二直化后   背景是0,字符是255(当然这也是人眼看出来的)  
   
  问题是我后面的识别操作都是对上述种的一种做的,遇到另外一种我必须先反色才能用后面的操作。  
  对计算机而言,什么时候要反色???当然人眼是一看就知道!!!  
  Top

9 楼oysoysoys(野比)回复于 2005-01-23 18:23:43 得分 0

对图象处理和模式识别有关的问题,大家都可以来探讨   。绝对欢迎!!!Top

10 楼I_Love_CPP(Never stop!)回复于 2005-01-23 19:15:07 得分 0

 
  1、如果你所有的图片是背景颜色占主体,那么就用占主体的颜色确定为背景颜色;  
        (如果你的所有图片文字颜色占主体,   类似)  
  2、一般而言,写字不可能写到四个角的象素上去,  
        因此用这4个点(或者之一)的颜色作为背景颜色。  
  Top

11 楼oysoysoys(野比)回复于 2005-01-24 15:48:50 得分 0

^_^,你这个想法是不错的   !  
  但是我这个是在抓取仪器画面的图像上进行识别,四个角,或选取区域的四条边   可能会有噪声点。  
  对于背景或前景是否占主体是未知的,这要根据选取区域的人来。选的大可能就背景占主体,选小的话可能字符是占主体的。:)  
   
  现在抓取仪器画面的图是每隔一小段时间,字符是变得,不知可不可以在这方面做文章??  
  Top

12 楼I_Love_CPP(Never stop!)回复于 2005-01-24 16:44:21 得分 0

Re:  
  "但是我这个是在抓取仪器画面的图像上进行识别,四个角,或选取区域的四条边可能会有噪声点"  
   
  你没有理解我的意思。  
  我是让你在二值化后再用那2个方法判断,  
  先去噪,再二值化,你二值化后图像上的点除了0就是255。  
   
  我也不清楚你的实际项目,你仔细分析一下,肯定有线索的!!!  
  一句话,就是找背景和文字的特征。Top

13 楼oysoysoys(野比)回复于 2005-01-24 17:38:26 得分 0

特征是有的,但并不是所有图片都符合的,这当然也是模式识别中的一个难点拉!  
  I_Love_CPP   先谢谢你对我的问题的关心,今天晚上我再想想。:)  
   
  Top

14 楼oysoysoys(野比)回复于 2005-01-25 10:20:23 得分 0

昨天晚上想拉想一个办法就是,二值图像垂直或水平投影  
  有字符的地方,不管啥背景的,它应当每一行或每一列都是0,255都有的,如果是纯背景或是一条直线字符(这个有可能是噪声拉),它的每一行或每一列要么全是0,要么全是255,比较全0,全255的列数或行数,那个统计的数目大,那个是背景的可能性要大的多。  
  当然有种情况是很难判断的,就是在列和行投影的时候,根本就没有出现过全0,全255   不太好判断!  
  不过这种我把它归入是拒识别的字符   :)  
   
  大家看看我这个思路咋样,昨天已经试验过,还请各位帮我看看,那里还不够完善,提点建议!Top

15 楼I_Love_CPP(Never stop!)回复于 2005-01-25 13:14:14 得分 0

试验的效果如何,识别率有多高啊?Top

16 楼oysoysoys(野比)回复于 2005-01-25 14:30:13 得分 0

这个现在还没牵扯到字符的最后识别   呵呵  
  对于背景的判断是还可以的Top

17 楼unicomhcg()回复于 2005-01-26 09:08:58 得分 10

“我对某一张图象,二直化后   可能   背景是255,字符是0(当然这是人眼看出来的)  
  如果又对另外一张的图象,二直化后   背景是0,字符是255(当然这也是人眼看出来的)  
   
  问题是我后面的识别操作都是对上述种的一种做的,遇到另外一种我必须先反色才能用后面的操作。  
  对计算机而言,什么时候要反色???当然人眼是一看就知道!!!”  
   
  如果对二值化后的图像每个象素点都统计,然后计算是255多,还是0多,同样,对另一个需要判别的图像也进行相同统计,  
   
  如果Pic_1的白色点多黑色点少而Pic_2也是白色点多黑色点少,那么就可以判断不用对第二个图像进行反色了,如果相反,那么就需要对第二个图像进行反色。  
   
  不知道可不可行,只是根据楼主描述的情况猜测一下Top

18 楼oysoysoys(野比)回复于 2005-01-26 10:50:49 得分 0

呵呵。楼上的你这个判断方法还是不能检测到图像的字符和背景!  
  虽说我后面的识别操作都是对上述种的一种做的,更准确的说应该是对字符进行操作  
  (eg腐蚀。。。)你所的方法就是使所有图片都是白色点多黑色或者是黑色多白色点。可以有一致性。  
  但它是不能判断黑点是字符还是背景的.你认为呢?Top

19 楼unicomhcg()回复于 2005-01-26 13:57:35 得分 0

如果是字符,那么以当前点为中心,向四周搜索,必然出现一个不是全黑或者全白的圈,而如果是背景,那么向四周搜索的时候,基本都是全黑或者全白(这要依据背景是什么来说了)。  
   
  那么能不能事前估计字符的大小,然后设置一个门限值,如果在此门限值下面的圈数都是全黑或者全白,就判断是背景,如果圈数里面出现了不是全黑或全白的,那就认为是字符?  
   
  是否可行呢?Top

20 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-01-26 14:36:15 得分 0

有些资料说根据灰度值来判断,他们认为灰度比较大的是背景,灰度比较小的是前景.Top

21 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-01-26 17:52:31 得分 0

你没有做字符分割的吗?  
   
  1)把版面校正  
  2)去除杂乱信息(去除图像,线条等)  
  3)图像增强(一系列滤波)  
  4)二值化  
  2)版面分割  
  3)单个字符分割(先行分割,再列分割)  
  4)识别单个字符.Top

22 楼oysoysoys(野比)回复于 2005-01-27 11:18:48 得分 0

To   unicomhcg()    
  好像你这个门限很难设定吧,Top

23 楼oysoysoys(野比)回复于 2005-01-27 11:24:15 得分 0

To   sboom(+-LingCh-+)  
  我做过字符分割,对于你列的一系列操作,我是做过其中的一些,因为有一些我不需要。  
  “根据灰度值来判断”,有这方面的资料吗?能否贴出链接出来。Top

24 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-01-27 13:24:06 得分 0

我书上的,你不是要我打出字来吧..........  
  我这本  
  <<智能图像处理技术>>   电子工业出版社   2004年7月,李?程   彭天强   彭波   主编,ISBN   7-121-00047-4  
  里面第八章讲图像分割的讲到根据前景和背景来分割图像  
   
  直方图阈值法  
  最大熵值法  
  2维直方图熵值法  
  统计判决决定门限法  
  局部阈值法  
  区域生长法  
  分裂-合并法  
  基于hough变换的方法  
  模糊阈值分割  
  基于2维直方图的模糊门限分割  
   
  有算法和数学公式.Top

25 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-01-27 13:29:42 得分 0

我这里有一个根据方差来判断前景和背景的程序,贡献出来不知道你有没有用,方差小的是背景,方差大的是前景.  
   
  bool   Foreground(unsigned   char   *image,int   height,int   width,int   piece)  
  {  
  int   i,j,k,l;  
  int   wi=width/piece+1;  
  int   hi=height/piece+1;  
  int   wl=width%piece;  
  int   hl=height%piece;  
  int   d=1000;  
   
  double   av,av2;  
   
  for(i=0;i<hi;i++)  
  {  
  for(j=0;j<wi;j++)  
  {  
  av=0;av2=0;  
  if(i!=hi-1   &&   j!=wi-1)  
  {  
  for(k=0;k<piece;k++)  
  {  
  for(l=0;l<piece;l++)  
  {  
  av+=image[(i*piece+k)*width+(j*piece+l)];  
  av2+=(image[(i*piece+k)*width+(j*piece+l)]*image[(i*piece+k)*width+(j*piece+l)]);  
  }  
  }  
  if(av2/(piece*piece)-(av/(piece*piece))*(av/(piece*piece))<d)  
  {  
  for(k=0;k<piece;k++)  
  {  
  for(l=0;l<piece;l++)  
  {  
  image[(i*piece+k)*width+(j*piece+l)]=0xff;  
  }  
  }  
  }  
  }  
  else   if(i==hi-1   &&   j!=wi-1)  
  {  
  for(k=0;k<hl;k++)  
  {  
  for(l=0;l<piece;l++)  
  {  
  av+=image[(i*piece+k)*width+(j*piece+l)];  
  av2+=(image[(i*piece+k)*width+(j*piece+l)]*image[(i*piece+k)*width+(j*piece+l)]);  
  }  
  }  
  if(av2/(hl*piece)-(av/(hl*piece))*(av/(hl*piece))<d)  
  {  
  for(k=0;k<hl;k++)  
  {  
  for(l=0;l<piece;l++)  
  {  
  image[(i*piece+k)*width+(j*piece+l)]=0xff;  
  }  
  }  
  }  
  }  
  else   if(i!=hi-1   &&   j==wi-1)  
  {  
  for(k=0;k<piece;k++)  
  {  
  for(l=0;l<wl;l++)  
  {  
  av+=image[(i*piece+k)*width+(j*piece+l)];  
  av2+=(image[(i*piece+k)*width+(j*piece+l)]*image[(i*piece+k)*width+(j*piece+l)]);  
  }  
  }  
  if(av2/(piece*wl)-(av/(piece*wl))*(av/(piece*wl))<d)  
  {  
  for(k=0;k<piece;k++)  
  {  
  for(l=0;l<wl;l++)  
  {  
  image[(i*piece+k)*width+(j*piece+l)]=0xff;  
  }  
  }  
  }  
  }  
  else  
  {  
  for(k=0;k<hl;k++)  
  {  
  for(l=0;l<wl;l++)  
  {  
  av+=image[(i*piece+k)*width+(j*piece+l)];  
  av2+=(image[(i*piece+k)*width+(j*piece+l)]*image[(i*piece+k)*width+(j*piece+l)]);  
  }  
  }  
  if(av2/(hl*wl)-(av/(hl*wl))*(av/(hl*wl))<d)  
  {  
  for(k=0;k<hl;k++)  
  {  
  for(l=0;l<wl;l++)  
  {  
  image[(i*piece+k)*width+(j*piece+l)]=0xff;  
  }  
  }  
  }  
  }  
  }  
  }  
  return   true;  
  }Top

26 楼hushuangyan74()回复于 2005-01-28 00:18:08 得分 5

可以根据你的要求来设置你的临界值的大小!Top

27 楼oysoysoys(野比)回复于 2005-01-29 16:34:14 得分 0

谢谢大家!先结贴吧,sboom(+-LingCh-+)(怪你过分美丽)   你的那种方法我会去试的。  
  同时也谢谢其他的兄弟们!:)Top

28 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-01-29 18:50:58 得分 0

你一分也不给我啊...Top

相关问题

  • 如何判断数据库中的图象字段为空?
  • 怎么样判断picturebox里面是否已经有图象?
  • 一个送分题(图象的前景与背景的区别)
  • 如何用DIB正确显示32位tga图象?
  • image控件不能正确显示CMYK模式的jpg图象?
  • 如何判断数据的正确?
  • 如何判断输入是否正确?
  • 判断表单录入的正确性?
  • 如何判断路径是否正确
  • 程序判断为何不正确呢

关键词

  • 字符
  • 模式
  • 图象
  • 背景
  • 识别
  • 分不清
  • 值
  • 正确的判断
  • 处理
  • 来表示

得分解答快速导航

  • 帖主:oysoysoys
  • I_Love_CPP
  • fanqing
  • unicomhcg
  • hushuangyan74

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo