「玩一玩」绘制投影直方图(我希望各位需要的能自己动手写下)

Conmajia 2012-06-12 07:37:49
加精
我在这篇《字符识别练习 分拆字符(验证码、车牌号、身份证号等)》帖子里用到了图像的投影直方图,然后就有不少筒子跟帖「求源码」。
你们可知道?我真心希望你们阅读下我给出的参考文献,自己动脑思考下,自己动手尝试下?
做这个直方图真的一点都不难啊,怎么就养成了有原理不思考,上来就要看源码的习惯呢?也许我不是专业人士,理解不了。我的认知里面,看源码还不如看原理清晰,看到原理我可以构思出个大概,用我自己的方式来实现。看源码,我的思路完全被禁锢在作者的思路里,遇上写作习惯差的,还能把脑袋绕晕。

下面我详解下怎么做。一看就明白了,真的很简单。
以下代码并非最佳效率,但可以说是最简单的,追求效率或者其他的自行改造。

投影直方图
projection histogram

从形式上看,是这样的(黑白样本):



放大看就类似于这样:



也就是说将样本图的每一列(以垂直投影为例),投影到直方图的某个坐标x上。

最简单的实现方法就来了:

变量:
Bitmap bmp (Width x Height)
int histo[Width]

1.遍历样本的每一点bmp.GetPixel(x,y)
2.如果颜色为黑,那么histo[x]++
3.统计完成,开始绘制

            for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
Color color = bmp.GetPixel(x, y);

if (color.R < 50 && color.G < 50 && color.B < 50)
histo[x]++;
}
}


绘制直方图

绘制直方图非常简单,只需要遍历每个histo[x]的值,即可

1.从y=height到y=height-histo[x]绘制一列线条
2.遍历histo[],直到画完所有点

            Bitmap tmp = new Bitmap(bmp.Width, bmp.Height);
using (Graphics g = Graphics.FromImage(tmp))
for (int i = 0; i < bmp.Width; i++)
{
g.DrawLine(
Pens.Black,
i,
tmp.Height,
i,
tmp.Height - histo[i]);
}


完成了。

完整代码(黑白样本)


Bitmap getProjectHistogram(Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;

int[] histo = null;
histo = new int[width];

for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
Color color = bmp.GetPixel(x, y);

if (color.R < 50 && color.G < 50 && color.B < 50)
histo[x]++;
}

// draw
Bitmap tmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(tmp))
for (int i = 0; i < width; i++)
g.DrawLine(
Pens.Black,
i,
height,
i,
height - histo[i]);
return tmp;
}



mutation

可以使用多个histo[]数组分别储存各个通道(A、R、G、B)的投影直方图(如果是彩色图像的话)

欢迎各位贴出自己的成果。
...全文
3567 115 打赏 收藏 转发到动态 举报
写回复
用AI写文章
115 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarkovLGXu 2013-05-31
  • 打赏
  • 举报
回复
yojinlin 2012-09-07
  • 打赏
  • 举报
回复
感謝分享。
LAONINGA098 2012-06-30
  • 打赏
  • 举报
回复
不错,感谢楼主分享。
god_fish 2012-06-29
  • 打赏
  • 举报
回复
支持下
wuren1 2012-06-26
  • 打赏
  • 举报
回复
不错支持
wenke311 2012-06-26
  • 打赏
  • 举报
回复
野比很活跃啊
MXF886 2012-06-25
  • 打赏
  • 举报
回复
很好,学习
speedboy1211 2012-06-24
  • 打赏
  • 举报
回复
支持下。
LAONINGA098 2012-06-24
  • 打赏
  • 举报
回复
谢谢分享.
XingKong22star 2012-06-23
  • 打赏
  • 举报
回复
.. 支持 !
showlie 2012-06-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
我在这篇《字符识别练习 分拆字符(验证码、车牌号、身份证号等)》帖子里用到了图像的投影直方图,然后就有不少筒子跟帖「求源码」。
你们可知道?我真心希望你们阅读下我给出的参考文献,自己动脑思考下,自己动手尝试下?
做这个直方图真的一点都不难啊,怎么就养成了有原理不思考,上来就要看源码的习惯呢?也许我不是专业人士,理解不了。我的认知里面,看源码还不如看原理清晰,看到原理我可以构思出个大概,用我自己……
[/Quote]

有个疑问,投影直方图能识别字符吗?这个不太可能吧!
Conmajia 2012-06-22
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 的回复:]
引用楼主 的回复:
我在这篇《字符识别练习 分拆字符(验证码、车牌号、身份证号等)》帖子里用到了图像的投影直方图,然后就有不少筒子跟帖「求源码」。
你们可知道?我真心希望你们阅读下我给出的参考文献,自己动脑思考下,自己动手尝试下?
做这个直方图真的一点都不难啊,怎么就养成了有原理不思考,上来就要看源码的习惯呢?也许我不是专业人士,理解不了。我的认知里面,看源码还不如看原理清晰,看到原理我可以……
[/Quote]

不能,请看标题《字符识别练习 分拆字符(验证码、车牌号、身份证号等)》
noa988 2012-06-22
  • 打赏
  • 举报
回复
很好 支持
wentianwu 2012-06-21
  • 打赏
  • 举报
回复
这些代码可以啊 我 总感觉好像缺少了点什么东西啊
Mars 2012-06-21
  • 打赏
  • 举报
回复
好棒啊楼主!
tianya861211 2012-06-21
  • 打赏
  • 举报
回复
支持分享
samuel1354 2012-06-21
  • 打赏
  • 举报
回复
好东西、应该学习、认真把文献看完
cy199164 2012-06-20
  • 打赏
  • 举报
回复
支持分享。。。。
  • 打赏
  • 举报
回复
不错,感谢楼主分享。
aawwmate 2012-06-20
  • 打赏
  • 举报
回复
这么做计算量太大,无法实际应用
加载更多回复(65)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧