有一幅,黑白格的BMP图形,只有黑白两色,,
1.能不能统计出黑格数目,
图形是扫描进来的,
2.如果扫描时图形,纸的位置没有放好,(很经常的事,)这时候什么办..
1.能不能统计出黑格数目,
图形是扫描进来的,
2.如果扫描时图形,纸的位置没有放好,(很经常的事,)这时候什么办..
解决方案 »
- Gps手机定位
- 请教一个问题:定义为pchar类型的变量是不是一定要释放内存
- 请教:怎样替换文本文件指定位置上的字符串(急等)
- 谁有编写外挂的技术资料?
- 用delphi写一个打包的工具
- 使用 Installshield express for delphi5.0打包程序是,如何配置bde别名,我用的是oracle 数据库
- 判断TMemo内当前光标在选择串的位置?
- FindFirstFile函数在软驱中没有软盘时(WIN2000)会弹出一个对话框,怎么屏蔽?
- 如何利用Delphi调用写字本的文字并写入数据库的相应字段
- 在delphi中如何实现象蚂蚁一样的断点续传的功能呢
- 大家看看这是啥字符..怎么转换成gb2312
- 有什么容器能够 透过背景,又 完全 不显示 自己的边框??
一天下来就你一个人来顶,,
如果那个做出photoshop的人在这里,也许能回答哦。呵呵,帮你顶一下啦。
其实Delphi 里,,,已经有像Bmp.Canvas.Pixels[m,n]
可以直接读每个像素的颜色值,,,
不要像我原来想的哪样还要去分析,,
bmp文件,,,位图是什么存的,,,现在关键是图片的校正,,
或者是,,定位边框,,,(其实也是为了校正图片)
图形是扫描进来的,canvas 的 Pixels 可以实现2.如果扫描时图形,纸的位置没有放好,(很经常的事,)这时候什么办..根据位置重新画一个了
的颜色值不就行了么
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;
你说的算法,我没有听说过,,,能不能帮忙一下找一下资料
tonylk(=www.tonixsoft.com=)
要学哪些东西,
我看不懂
没有参照线(参照物),程序怎么知道该调整的角度多少???photoshop 也是由操作员输入一个旋转角度调整的呀.如果在左上角(右上角,左下角,右下角)能有非常明显的参照线,水平(垂直),关键是分析出参照线对于水平(垂直)的偏斜角度,然后根据此角度旋转图像.
我已经发到[email protected] ,谢谢
我提提我的思路:
既然是扫描的,我想失真应该不至于太离谱
首先先将该bmp转换成灰度图
你可以用一个二维数组Pic[i][j]来存图像的灰度值(8Bit即可),可以使用.GetBValue方法得到灰度值
既然是扫描的,肯定不能保证是二值图像
所以要进行阈值分割,限定一个阈值,高于这个阈值的置为255,低于该阈值的设为0
这些预处理步骤肯定是需要的。
接着,如果按搂主所说,想得到边框,用soble算子运算可得到他的边缘图像(边缘为黑色,其余为白色)
然后要根据具体的图像特征进行调整了。不知道能不能帮上忙。
http://202.115.16.8/~zplinze/IMAGES/DIP.jpg
既然是扫描的,肯定不能保证是二值图像扫描的时候,,可以选择黑白两色扫描
(连灰度都没有)主要不是这些问题
那么涂抹格子的时候是否均匀,会不会有漏图的很小的点?
既然是以黑白两色扫描,扫描之后产生的噪声主要是什么噪声?比如是随机的点噪声还是其余的失真?
如果只是旋转的角度问题影响倒不大。
如果噪声是以随机点的形式出现的(包括黑格中的白点和白格中的黑店),可以采用中值滤波的方式,很容易去掉。因为噪声点面积较小,周围又都是和他反色的,所以很容易去除噪声。因为是在黑边格子上图的,如果黑边比较细,可以考虑用形态学的腐蚀算法,有效的去掉格子的边。剩下的就是白色,和白色上的几个黑块。
然后统计黑块的象素数(由于前面已经将噪声去除,所以误差不大。如果不进行这些预处理的话,结果会有较大的出入)求平均即可。
又或者可以用上面提到的sobel算子计算边缘,这时候图像变成黑底,和若干个白色边框,也可确定图像中黑色格子数。
一个黑边格子,填入若干黑色块。加入随机噪声(黑色块上的白色和白色上的黑色)
经过滤波、分割后的效果,及其边缘
我想根据预处理之后的结果,要计算出格子的个数并不难吧?
如果没能有效的去除噪声和格子的黑边,对计算的结果会又很大的影响
http://202.115.16.8/~zplinze/IMAGES/TEST1.jpg
不好意思,,我把图发到你的邮箱里面了[email protected]
图片处理,我没有这方面的知识
有基础的书您可以指点一下,,在这里深表感谢
其实还要算出黑点格子的位置
(发给您的图片,,是A3纸,用A4的扫描义,,所以只有半张,
但这没有什么影响)
然后进行多次中值滤波:
中值滤波的基本原理: 假设要计算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%以上,就认为该窗口被选中,即可确定它的位置。以上只是基本的算法,是否可行、如何调整我们可以一起讨论讨论
下图是滤波前的原图
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程序我打包发到楼主信箱里
算是抛砖引玉吧
因为有几百张图,,每张都处理一次 ,,,把这步省了,,我就晕了也没有处理的那么麻烦(太慢了),,不过这些对我来说是新知识 ,,,非常感谢我把我做的程序发到您的邮箱里,,帮我看看,,有没有定位边框的方法,,
如果能帮我想出办法,,发email给我,,我再开贴这个问题放久了,,结贴了