V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
akaayy
V2EX  ›  问与答

一张平铺图案生成的大图片,怎么可以快速从里面把最小单位的平铺(填充)图案截取出来??

  •  
  •   akaayy · 2020-01-02 12:06:01 +08:00 · 1173 次点击
    这是一个创建于 1790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如这个图片


    https://i.loli.net/2020/01/02/nuSEXUkVgtTa6Md.png

    提取一个最小单位的图片,类似 ps 中的填充图案,这样就可以用于网页背景了

    有没有快捷工具,或者快捷技巧?
    2 条回复    2020-01-02 14:56:45 +08:00
    msg7086
        1
    msg7086  
       2020-01-02 14:00:23 +08:00
    上下找同花纹的,左右找同花纹的。

    你这个的话,随便找一个圆顶,往下找到他正下方圆顶,再继续往右找到正右方圆顶,然后从圆顶框到圆顶就行了。
    sanmaozhao
        2
    sanmaozhao  
       2020-01-02 14:56:45 +08:00   ❤️ 2
    简单粗暴,从左上角开始穷举就行了。用 python 简单写了一个,最后找到的是 75*67:

    import numpy as np
    import cv2
    import math

    def is_same(a,b):
    difference = cv2.subtract(a, b)
    return not np.any(difference)

    img = cv2.imread("nuSEXUkVgtTa6Md.png")

    # 先找纵向
    for i in range(1, img.shape[0]//2):
    img_pattern = img[0:i, :]
    # 按现有的高度平铺成与原始图像等大
    img_tile = np.tile(img_pattern, (math.ceil(img.shape[0]/i),1,1))
    img_tile = img_tile[0:img.shape[0],:]
    if is_same(img_tile,img):
    break

    # 再找横向
    for j in range(1, img.shape[1]//2):
    img_pattern = img[:, 0:j]
    img_tile = np.tile(img_pattern, (1,math.ceil(img.shape[1]/j),1))
    img_tile = img_tile[:,0:img.shape[1]]
    if is_same(img_tile,img):
    break

    print(i,j)

    cv2.imshow("img_pattern", img[0:i, 0:j])
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1746 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:48 · PVG 00:48 · LAX 08:48 · JFK 11:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.