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

2020-01-02 12:06:01 +08:00
 akaayy
比如这个图片


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

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

有没有快捷工具,或者快捷技巧?
1187 次点击
所在节点    问与答
2 条回复
msg7086
2020-01-02 14:00:23 +08:00
上下找同花纹的,左右找同花纹的。

你这个的话,随便找一个圆顶,往下找到他正下方圆顶,再继续往右找到正右方圆顶,然后从圆顶框到圆顶就行了。
sanmaozhao
2020-01-02 14:56:45 +08:00
简单粗暴,从左上角开始穷举就行了。用 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()

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

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

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

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

© 2021 V2EX