有一幅,黑白格的BMP图形,只有黑白两色,,
1.能不能统计出黑格数目,
图形是扫描进来的,
2.如果扫描时图形,纸的位置没有放好,(很经常的事,)这时候什么办..

解决方案 »

  1.   

    我查了BMP 的储存格式,只有黑白两色的时候 ,,是以一个 位 表示一个像素,
      

  2.   

    agilecoder(原始森林),,,
     一天下来就你一个人来顶,,
      

  3.   

    涉及到好多算法的问题哦,
    如果那个做出photoshop的人在这里,也许能回答哦。呵呵,帮你顶一下啦。
      

  4.   

    刚开始的时候,,我也把问题想难了
    其实Delphi 里,,,已经有像Bmp.Canvas.Pixels[m,n]
    可以直接读每个像素的颜色值,,,
    不要像我原来想的哪样还要去分析,,
    bmp文件,,,位图是什么存的,,,现在关键是图片的校正,,
    或者是,,定位边框,,,(其实也是为了校正图片)
      

  5.   

    1.能不能统计出黑格数目,
    图形是扫描进来的,canvas 的 Pixels 可以实现2.如果扫描时图形,纸的位置没有放好,(很经常的事,)这时候什么办..根据位置重新画一个了
      

  6.   

    循环检验Bmp.Canvas.Pixels[m,n]
    的颜色值不就行了么
      

  7.   

    //用这个函数吧function GetBlackPointSizeOfBmp(Bmp:TBitmap):Integer;
    var
        x,y:Integer;
    begin
         Result:=0;
         with Bmp do
         begin
              for y:=0 to Height-1 do
                   for x:=0 to Width-1 do
                       if Canvas.Pixels[x,y]=0 then Inc(result);
         end;
    end;
      

  8.   

    图片是,,黑色边框 的格子格子里面用笔涂黑,,不会有重叠
    你说的算法,我没有听说过,,,能不能帮忙一下找一下资料
     tonylk(=www.tonixsoft.com=)
      

  9.   

    http://www.chinaai.org/Article_Show.asp?ArticleID=325有关细线算法的,,,不懂
      

  10.   

    tonylk(=www.tonixsoft.com=) 有书之类的也行,,推荐一下,
    要学哪些东西,
    我看不懂
      

  11.   

    GoldShield(金盾) ( ),,,是累,,,图发到哪里去啊
      

  12.   


    没有参照线(参照物),程序怎么知道该调整的角度多少???photoshop 也是由操作员输入一个旋转角度调整的呀.如果在左上角(右上角,左下角,右下角)能有非常明显的参照线,水平(垂直),关键是分析出参照线对于水平(垂直)的偏斜角度,然后根据此角度旋转图像.
      

  13.   

    顶,学了PHOTOSHOP似乎也不能完全搞定
      

  14.   

    把你的图发一张给我看看。[email protected](注明“读BMP图象”)
      

  15.   

    Hewin(hewin) ( )谢谢
    我已经发到[email protected] ,谢谢
      

  16.   

    发个图片到[email protected],我看看?
    我提提我的思路:
    既然是扫描的,我想失真应该不至于太离谱
    首先先将该bmp转换成灰度图
    你可以用一个二维数组Pic[i][j]来存图像的灰度值(8Bit即可),可以使用.GetBValue方法得到灰度值
    既然是扫描的,肯定不能保证是二值图像
    所以要进行阈值分割,限定一个阈值,高于这个阈值的置为255,低于该阈值的设为0
    这些预处理步骤肯定是需要的。
    接着,如果按搂主所说,想得到边框,用soble算子运算可得到他的边缘图像(边缘为黑色,其余为白色)
    然后要根据具体的图像特征进行调整了。不知道能不能帮上忙。
      

  17.   

    下图是左上角的图片经过阈值(90)分割后,Rob算子边缘提取的结果
    http://202.115.16.8/~zplinze/IMAGES/DIP.jpg
      

  18.   

    zplinze(linze)
    既然是扫描的,肯定不能保证是二值图像扫描的时候,,可以选择黑白两色扫描
    (连灰度都没有)主要不是这些问题
      

  19.   

    主要当然不是这些问题,但是预处理是正确计算的基础。也能在很大程度影响计算结果的效率和准确性。
    那么涂抹格子的时候是否均匀,会不会有漏图的很小的点?
    既然是以黑白两色扫描,扫描之后产生的噪声主要是什么噪声?比如是随机的点噪声还是其余的失真?
    如果只是旋转的角度问题影响倒不大。
    如果噪声是以随机点的形式出现的(包括黑格中的白点和白格中的黑店),可以采用中值滤波的方式,很容易去掉。因为噪声点面积较小,周围又都是和他反色的,所以很容易去除噪声。因为是在黑边格子上图的,如果黑边比较细,可以考虑用形态学的腐蚀算法,有效的去掉格子的边。剩下的就是白色,和白色上的几个黑块。
    然后统计黑块的象素数(由于前面已经将噪声去除,所以误差不大。如果不进行这些预处理的话,结果会有较大的出入)求平均即可。
    又或者可以用上面提到的sobel算子计算边缘,这时候图像变成黑底,和若干个白色边框,也可确定图像中黑色格子数。
      

  20.   

    刚才我草草试了一下,
    一个黑边格子,填入若干黑色块。加入随机噪声(黑色块上的白色和白色上的黑色)
    经过滤波、分割后的效果,及其边缘
    我想根据预处理之后的结果,要计算出格子的个数并不难吧?
    如果没能有效的去除噪声和格子的黑边,对计算的结果会又很大的影响
    http://202.115.16.8/~zplinze/IMAGES/TEST1.jpg
      

  21.   

    zplinze(linze)
    不好意思,,我把图发到你的邮箱里面了[email protected]
      

  22.   

    zplinze(linze)
    图片处理,我没有这方面的知识
    有基础的书您可以指点一下,,在这里深表感谢
    其实还要算出黑点格子的位置
    (发给您的图片,,是A3纸,用A4的扫描义,,所以只有半张,
    但这没有什么影响)
      

  23.   

    目前为止如果要精确的定位的话,我先用photo截掉了表格以外的部分
    然后进行多次中值滤波:
    中值滤波的基本原理: 假设要计算Image[i][j]的值,先对以Image[i][j]为中心的一个正方形(窗)内的图像象素进行排序。位于中间的那个就是Image[i][j]变换后的值。
    这样如果Image[i][j]是黑的,而Image[i][j]周围有有较多白色的话,就会被窗口的中值白色所替换,反之亦然。因此能有效的去除比窗口宽度小的噪声。
    既然是以Image[i][j]为中心,所以滤波时要选取奇数作为窗口的宽度
    ------------
    0,0|0,1|0.2|        这是一个3×3的滤波窗口
    ------------
    1,0|1,1|1.2|        这样(1,1)的值会被(0,0)~(2,2)的中间值所替代
    ------------
    2,0|2,1|2.2|
    ------------
    由于该图是二值图像,所以我对上述算法进行了修改,除去了排序过程,而改用象素值的累加。因为数组中只有255和0两中数据,所以根据累加和很容易判断那个数据占多数。
    由于中值滤波会在图像四周边缘留下噪声,所以我手动对图像四周边缘进行了白色填充。首先选用较小窗口进行滤波,可以去除扫描时引入的随机噪声和细的边框、题号数字。
    同时避免因为窗口过大而使相邻的两格被连在一起
    但是如果边框较粗,则还会留下一些噪声,此时选用较大的窗口再滤几次即可,就是速度太慢。滤波之后,从左上角开始计算,
    用一个矩形窗在图像上移动,计算窗内黑色象素占窗口的百分比,如果黑色象素占窗口的30%以上,就认为该窗口被选中,即可确定它的位置。以上只是基本的算法,是否可行、如何调整我们可以一起讨论讨论
      

  24.   

    我草草写了一个程序,界面比较简陋,一下是对图像一部分的检测结果
    下图是滤波前的原图
    http://202.115.16.8/~zplinze/IMAGES/old.jpg
    下图是经过滤波后的图
    黑色边框是检测时检测到存在答案时框上的http://202.115.16.8/~zplinze/IMAGES/filter.jpg
    下图是计算结果
    http://202.115.16.8/~zplinze/IMAGES/ans.jpg程序我打包发到楼主信箱里
    算是抛砖引玉吧
      

  25.   

    目前为止如果要精确的定位的话,我先用photo截掉了表格以外的部分  其实我最苦恼的就是边框的定位,,,,
    因为有几百张图,,每张都处理一次 ,,,把这步省了,,我就晕了也没有处理的那么麻烦(太慢了),,不过这些对我来说是新知识 ,,,非常感谢我把我做的程序发到您的邮箱里,,帮我看看,,有没有定位边框的方法,,
      

  26.   

    zplinze(linze) 
    如果能帮我想出办法,,发email给我,,我再开贴这个问题放久了,,结贴了