[巨型难题] 如何通过 Python ,确定图片剪裁位置

2020-06-25 14:50:36 +08:00
 vertigo

如图,当有两张图,左边为源文件,右边为剪裁(且等比拉伸)后的图片

请问如何通过程序来判断右图位于左图什么位置(例如返回四个角坐标)

5046 次点击
所在节点    程序员
45 条回复
JCZ2MkKb5S8ZX9pq
2020-06-25 16:38:00 +08:00
@vertigo 但你的需求不知道合不合适用它这个,它是个测试框架。可以翻翻它的 github,感觉可能就是 cv2 。
cnt2ex
2020-06-25 16:39:49 +08:00
相关滤波算法

尺度可以把图片变换到 logpolar 空间估计
cnt2ex
2020-06-25 16:42:47 +08:00
其实还可以用目标检测的方法。直接用深度学习的那堆模型检测两个图片中物体的坐标 x,y,w,h,再用模板匹配。
vertigo
2020-06-25 16:59:43 +08:00
@JCZ2MkKb5S8ZX9pq 卧槽牛逼
vertigo
2020-06-25 17:03:36 +08:00
@cnt2ex 去哪里可以找到玩过这些算法的老哥呢
tiancaixiaoshuai
2020-06-25 17:17:42 +08:00
@vertigo $是美元,代表钱,cha-ching 是模仿收银机的声音,代表钱进账

很多网站的图片素材都是从网上找的,然后把原图切一下拉到合适的尺寸自己用,或者就是单纯的截一部分,假装跟原图不一样。从网上找到的图片所在网站本身可能就是盗的图,并不能以此确定这张图片是否可以商用,如果使用了这种图片,被原创者发现,就要交钱(版权费)

那么,一些做图片资源的网站,例如某觉中国,使用了你说的这个技术,批量扫描全网的网站,把图片拿来跟自己的数据库对比,找出盗图的网站、相关图片、以及相关图片截取了自己图片的哪个位置,发送律师函,收钱
SharkU
2020-06-25 17:31:38 +08:00
@tiancaixiaoshuai 有道理
jmc891205
2020-06-25 17:47:19 +08:00
与 scale 和 rotation 无关的 template matching 算法
你预算多少?
dick20cm
2020-06-25 18:54:04 +08:00
与 scale 和 rotation 无关的 template matching 算法,简单的一批
ctolib
2020-06-25 19:00:31 +08:00
@vertigo 网上搜索一下模板匹配算法 一堆的示例代码。
vertigo
2020-06-25 20:13:52 +08:00
@ctolib 好的谢谢老板
cz5424
2020-06-25 23:03:25 +08:00
做过类似的需求,来确定视频中水印位置,用得是 opencv 的 SIFT
supermoonie
2020-06-25 23:14:26 +08:00
@vertigo 我有一个 OpenCV 的群,群主是贾志刚,51CTO 里的讲师,需要的话,我可以帮你
gorillazksl
2020-06-25 23:35:46 +08:00
没有 scale 和 rotation @TtiGeR 的 link 就能 work.
有 scale 和 rotation, 先用 SIFT(总的来说 SIFT 还是所有 Feature detection 方法里对所有情况平均性能最好的,如果有速度的要求可以用 SURF 之类的) match 一些 point 再根据这些 point 估计 scale 和 rotate 的参数 然后再用 @TtiGeR 的 link 就行
CoCoMcRee
2020-06-25 23:39:09 +08:00
模糊匹配, 很好奇你是想用在什么场景下.

我之前也游戏脚本时用过这个.
imn1
2020-06-25 23:55:11 +08:00
右图存在的话,就几行而已

def compTmpl(image, target):
img_rgb = cv2.imread(image)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = target
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.9
loc = numpy.where( res >= threshold)
return loc

threshold 是临界值,自己按需要调整
gorillazksl
2020-06-26 00:04:54 +08:00
@imn1 Opencv 的 matchTemplate 是没有考虑到 scale 和 rotation 的 所以只有在没有 scale 和 rotation 的前提下才会比较 work
nightwitch
2020-06-26 00:21:42 +08:00
右图是已知的,或者有近似的模板,搜关键词 模板匹配(template matching)
如果你只有左图,想从中扣出一些物体所在的区域,搜关键词 目标检测, 比较容易的( FRNN, YOLOv3)
imn1
2020-06-26 00:27:37 +08:00
@gorillazksl #37
如果尺寸相差不太大,还是可以的
我经常用这招找图,在图 1 中随机在图中心附近画一个不太大矩形,然后用这个矩形去一堆图里面找(尺寸不同,但基本接近),输出匹配,比起 imgHash 更好使,因为 imgHash 在:
1.出现比较大幅的裁边,或者加厚框
2.比例相差大
3.大水印
这些情况,不容易匹配上
重点是最终我还是要肉眼判定,程序只是找出来而已,纯自动化我心还没那么大

至于旋转,看需求可以添加代码,cv2 就是个矩阵而已,平常没必要想太多,毕竟人眼不能旋转看图,大部分情况两幅图是同向的,旋转的情况不多
cht
2020-06-26 02:23:17 +08:00
SIFT 正解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX