关于图像识别

dadasjd 发布于 2015年03月09日 | 更新于 2015年03月10日
无人欣赏。

公司网站有个新需求,就是可以识别出带有某个特定公司水印的图片,之前试过用opencv训练分类器,但是尝试了一个月也没训练出成型的分类器,本人在图片识别方面没有任何经验,大家可以提些意见吗?如何才能做到识别出带有特定水印的图片?

alt text

共18条回复
tinyfool 回复于 2015年03月09日

你怎么说也发几张demo吧,大家可以帮你分析,说问题的时候空口白牙容易扯到蛋

dadasjd 回复于 2015年03月09日

1楼 @tinyfool 要发什么demo呀?opencv的训练过程?我想问一下还有没有其他出路~问题问的不好,见谅。。

tinyfool 回复于 2015年03月09日

2楼 @dadasjd 图片的demo,没有图片广说水印,谁知道是哪种,水印多了

dadasjd 回复于 2015年03月09日

3楼 @tinyfool 多谢,加上图片了。

tinyfool 回复于 2015年03月09日

4楼 @dadasjd 你试过opencv里面的啥算法?我之前测试过一个什么特征抽取算法,我也忘了名字,貌似可以做类似的

dadasjd 回复于 2015年03月09日

5楼 @tinyfool LBP 和 haar 就是用它这带的程序训练的,两个都试过,都没得到比较好的效果。

xiaotie 回复于 2015年03月09日

边缘检测,模板匹配就行了。更进一步的话,用 stroke width transform

dadasjd 回复于 2015年03月10日

7楼 @xiaotie 模板匹配试过,效果也不理想。我去找一下“stroke width transform”相关资料。

xiaotie 回复于 2015年03月10日

8楼 @dadasjd

边缘检测之后再用模板匹配。你这个水印,边缘特征比较明显。如果水印大小、位置不变,那么特别好检测。如果大小不变,可以用一个搜索框搜索图片区域,计算边缘检测后的直方图,使用直方图相似性来匹配。

更进一步,水印是加在原始图像上,假设没有水印,那么当前水印边缘位置两侧的像素大部分应该是“相似”或“连续”的,由于加了固定的白色水印,导致不连续了。而这个不连续,可以用alpha混合的公式来计算。这样,你可以计算出每一个边缘点属于水印边缘的概率,如果一块区域里有大量的边缘点属于水印边缘的概率很高,那么这一块区域就是水印。

stroke width transform 是检测文字的。也可以用来辅助项。

总之,方法很多很多 弄图像识别,只会调用OpenCV的API是远远不够的。。。

xiaotie 回复于 2015年03月10日

6楼 @dadasjd LBP 和 haar 不是用来搞这个的

dadasjd 回复于 2015年03月10日

10楼 @xiaotie 哦哦 是嘛~ 不是很懂,也是别人推荐用的opencv,然后训练器里只有这两种,请问 lbp和haar为什么不适用这种情况呀,那他们适合什么呢?

dadasjd 回复于 2015年03月10日

9楼 @xiaotie 恩恩 ,是的, 我们之前只调用的api,我重新发了一个截图,水印好多是透明的。

xiaotie 回复于 2015年03月10日

11楼 @dadasjd

水印是半透明的,LBP和haar不擅长搞这个。你就算用它们,也得在边缘上来搞。

dadasjd 回复于 2015年03月10日

13楼 @xiaotie 哦 哦,十分感谢,图像识别方面缺少太多经验了,请问有比较类似的demo之类的吗?这个问题我们已经搞了1个月左右了,实在是没有方向。

xiaotie 回复于 2015年03月10日

做这些头脑要清晰,至于工具,都是次要的。抛开工具,咱们从数学角度谈谈。假设原始图像有个像素点的色彩为 (r,g,b),水印图片的颜色为 (wr,wg,wb),采用 alpha 混合,混合后的图像的像素点为(R,G,B),混合公式为

R = r * alpha + (1 - alpha) * wr

G = g * alpha + (1 - alpha) * wg

B = b * alpha + (1 - alpha) * wb

通过这张图片可以猜想 wr = wg = wb = 255。 要求的就是 alpha。 可以在图像中找到一个平缓的地方。正好水印覆盖一半的地方,分别在水印区域和非水印区域采样,因为平缓,可以认为两个样本在原始图像中的色彩一样,这样可以得到alpha。混合公式就有了。

下面就是检测:

对图像取Canny边缘,沿着边缘的法线方向在边缘内外分别取一个样本,检查这个样本满足上面公式的满足程度。如果相差很大,认为这个边缘是水印边缘的概率很小,如果差异很小,认为这个边缘有很大概率是水印边缘的边缘点。这样,对每个边缘点都把概率计算出来,设一个区域概率密度阈值,超过这个阈值就认为存在水印。

xiaotie 回复于 2015年03月10日

14楼 @dadasjd

可以提供思路,但不免费提供代码嘿嘿。这样的代码一行代码100块钱呢。

dadasjd 回复于 2015年03月10日

16楼 @xiaotie 恩恩,理解,收费是正常的。先谢谢提供思路,如果需要我再联系您。

dadasjd 回复于 2015年03月10日

1楼 @tinyfool 为什么发的图片,有的时候看得到,有的时候看不到?

本帖有18个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]