V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vertigo
V2EX  ›  程序员

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

  •  
  •   vertigo ·
    lidamaoHub · 2020-06-25 14:50:36 +08:00 · 5057 次点击
    这是一个创建于 1623 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2020-06-25 15:27:32 +08:00
    新增一个难度,如果截取后不固定比例拉伸,有没有办法


    如果有大佬有方案,也可以付费获取方案 邮箱 bGlkYW1hb0BkaWFuZ2V6YW4ubWU=
    45 条回复    2020-06-26 13:02:02 +08:00
    gwy15
        1
    gwy15  
       2020-06-25 14:54:27 +08:00   ❤️ 2
    SIFT, SURF, etc.
    hackpro
        2
    hackpro  
       2020-06-25 14:56:26 +08:00 via iPad
    YOLO
    vicsun2020
        3
    vicsun2020  
       2020-06-25 15:00:45 +08:00 via iPhone
    都导入成 rgb 数组然后写循环判断成不成😂😂
    是不是太土了,楼上都是现成的库吗
    vertigo
        5
    vertigo  
    OP
       2020-06-25 15:02:58 +08:00
    @vicsun2020 土完全没关系,能解决问题即可,但是不知道拉伸是否会增加 rgb 色块。。。(我没有搞过图像内容)
    vertigo
        6
    vertigo  
    OP
       2020-06-25 15:04:29 +08:00
    @gwy15
    @hackpro
    @TtiGeR
    谢谢楼上大神,我先去康康学习一个
    lithbitren
        7
    lithbitren  
       2020-06-25 15:08:36 +08:00
    涉及拉伸用循环大概率是不行的,最好还是用现成的模糊匹配库
    xmoiduts
        8
    xmoiduts  
       2020-06-25 15:16:36 +08:00 via Android
    hog 特征+滑动窗口匹配?(我瞎猜的 最近被 hog 折磨得不行……)
    vertigo
        9
    vertigo  
    OP
       2020-06-25 15:25:20 +08:00
    @xmoiduts 关键是不知道裁剪后拉伸多少
    vertigo
        10
    vertigo  
    OP
       2020-06-25 15:26:24 +08:00
    对了,如果有大佬有方案,也可以付费 邮箱 bGlkYW1hb0BkaWFuZ2V6YW4ubWU=
    imn1
        11
    imn1  
       2020-06-25 15:34:20 +08:00   ❤️ 1
    右图不存在的话是个难题,右图已存在的话是个送分题,不对,送钱题

    主要问题是程序不知道你要抠什么
    ctolib
        12
    ctolib  
       2020-06-25 15:39:22 +08:00 via Android
    你看一下,模板匹配算法是不是可以解决你的问题
    tiancaixiaoshuai
        13
    tiancaixiaoshuai  
       2020-06-25 15:47:52 +08:00   ❤️ 1
    以后从网上找素材可要小心了,一定要确定好版权问题。

    资源站又多了一个发财致富的路:批量扫全网网站,匹配图片,发送律师函,$$$cha-ching !
    TimePPT
        14
    TimePPT  
       2020-06-25 16:01:01 +08:00 via Android
    六年前在某视频网站做过视频自动抽帧截图做封面,当时上了机器学习做重点内容区域识别(不用识别具体实体是啥)。大概一千张的成对训练集就能做到很好的效果。

    现在估计有更好的算法实现了。
    JCZ2MkKb5S8ZX9pq
        15
    JCZ2MkKb5S8ZX9pq  
       2020-06-25 16:11:14 +08:00
    cv2 ?好像网易那个测试工具就有全屏找图返坐标的,现成端口,我记得是返中心点。
    zmlu
        16
    zmlu  
       2020-06-25 16:14:07 +08:00 via iPhone
    OpenCV
    vertigo
        17
    vertigo  
    OP
       2020-06-25 16:21:19 +08:00
    @JCZ2MkKb5S8ZX9pq 网易有现成的么?请问还记得叫什么嘛
    vertigo
        18
    vertigo  
    OP
       2020-06-25 16:21:32 +08:00
    @tiancaixiaoshuai 兄弟这是啥啊..
    vertigo
        19
    vertigo  
    OP
       2020-06-25 16:22:07 +08:00
    @ctolib 关键是我不会算法,就很尴尬,所以才来问是否有现成的模块可以用
    JCZ2MkKb5S8ZX9pq
        20
    JCZ2MkKb5S8ZX9pq  
       2020-06-25 16:36:41 +08:00
    [Airtest Project]( http://airtest.netease.com/)

    我用 python 试过,嫌参数太复杂了,后来写了个别的。
    JCZ2MkKb5S8ZX9pq
        21
    JCZ2MkKb5S8ZX9pq  
       2020-06-25 16:38:00 +08:00
    @vertigo 但你的需求不知道合不合适用它这个,它是个测试框架。可以翻翻它的 github,感觉可能就是 cv2 。
    cnt2ex
        22
    cnt2ex  
       2020-06-25 16:39:49 +08:00
    相关滤波算法

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

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

    那么,一些做图片资源的网站,例如某觉中国,使用了你说的这个技术,批量扫描全网的网站,把图片拿来跟自己的数据库对比,找出盗图的网站、相关图片、以及相关图片截取了自己图片的哪个位置,发送律师函,收钱
    SharkU
        27
    SharkU  
       2020-06-25 17:31:38 +08:00
    @tiancaixiaoshuai 有道理
    jmc891205
        28
    jmc891205  
       2020-06-25 17:47:19 +08:00 via iPhone
    与 scale 和 rotation 无关的 template matching 算法
    你预算多少?
    dick20cm
        29
    dick20cm  
       2020-06-25 18:54:04 +08:00
    与 scale 和 rotation 无关的 template matching 算法,简单的一批
    ctolib
        30
    ctolib  
       2020-06-25 19:00:31 +08:00 via Android
    @vertigo 网上搜索一下模板匹配算法 一堆的示例代码。
    vertigo
        31
    vertigo  
    OP
       2020-06-25 20:13:52 +08:00
    @ctolib 好的谢谢老板
    cz5424
        32
    cz5424  
       2020-06-25 23:03:25 +08:00 via iPhone
    做过类似的需求,来确定视频中水印位置,用得是 opencv 的 SIFT
    supermoonie
        33
    supermoonie  
       2020-06-25 23:14:26 +08:00
    @vertigo 我有一个 OpenCV 的群,群主是贾志刚,51CTO 里的讲师,需要的话,我可以帮你
    gorillazksl
        34
    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
        35
    CoCoMcRee  
       2020-06-25 23:39:09 +08:00
    模糊匹配, 很好奇你是想用在什么场景下.

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

    至于旋转,看需求可以添加代码,cv2 就是个矩阵而已,平常没必要想太多,毕竟人眼不能旋转看图,大部分情况两幅图是同向的,旋转的情况不多
    cht
        40
    cht  
       2020-06-26 02:23:17 +08:00
    SIFT 正解
    poringking
        41
    poringking  
       2020-06-26 03:02:32 +08:00
    这个问题叫 direct image alignment,如果不改变比例,那参数就是平移,2 个自由度,如果改变比例,那再加两个自由度,可以用 lucas kanade 算法,用其中的 inverse compositional lk 最快,只用算 template 的 jacobian 。
    lunafreya
        42
    lunafreya  
       2020-06-26 03:22:28 +08:00 via iPhone
    专业 cv 人来答一下,这个非常简单,不需要高级操作。你只需要找到几个对应点的位置(你的仿射变换有几个自由度就找几个点),然后算出仿射变换的参数即可。
    RadishWind
        43
    RadishWind  
       2020-06-26 10:31:13 +08:00
    opencv 的 template 匹配,之前做脚本的时候玩过
    ctro15547
        44
    ctro15547  
       2020-06-26 10:43:21 +08:00
    如果只是以图找图的话 opencv 就行。百度下几行代码的事情。
    gargar
        45
    gargar  
       2020-06-26 13:02:02 +08:00
    有些情况不太好确定四角坐标:
    抠出的图是不规则区域;
    由原图多个部分拼接的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3490 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:11 · PVG 19:11 · LAX 03:11 · JFK 06:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.