akaayy
V2EX  ›  问与答

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

  •  
  •   akaayy · Jan 2, 2020 · 1540 views
    This topic created in 2336 days ago, the information mentioned may be changed or developed.
    比如这个图片


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

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

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

    你这个的话,随便找一个圆顶,往下找到他正下方圆顶,再继续往右找到正右方圆顶,然后从圆顶框到圆顶就行了。
    sanmaozhao
        2
    sanmaozhao  
       Jan 2, 2020   ❤️ 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()
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3468 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:43 · PVG 18:43 · LAX 03:43 · JFK 06:43
    ♥ Do have faith in what you're doing.