介绍
这个小程序把如图白底黑字的图片,转换成黑底白字的拓片形式的图片。
如果有红色米字格,会去掉红色米字格。
背景黑色来源于李祺本《九成宫》,程序会自动根据输入的图片做一些调整。
使用说明
- 把下面代码拷贝到特定目录下,保存为blackbg.py。
- 在以上目录下建立目录images。把黑色背景文件都拷贝到images目录下。
- 把需要转换的(米字格)图片保存到到以上目录下。
- 运行blackbg.py文件,输入参数为:行数,列数,需要转换的(米字格)图片文件名。程序生成output.jpg文件。
python3 blackbg.py <rownum> <colnum> <input.jpg>
代码
from skimage import io
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray, rgb2hsv, hsv2rgb
from skimage import transform
from random import shuffle
import random
import sys
import os
def background(rownum, colnum):
unit = 167
nulls= os.listdir(path='./images')
num = rownum * colnum
grids_num = 0
grids = []
while (grids_num < num):
shuffle(nulls)
grids += nulls.copy()
grids_num += len(nulls)
grids = grids[:num]
black = np.zeros((unit * rownum , unit * colnum, 3),dtype=np.uint8)
i = 0
angles = [0, 0, 0, 90, 180, 180, 180, 270]
angles = [0, 180]
changes = [0, 0, 0, 0, 0, 1, 2, 3]
for col in range(colnum):
for row in range(rownum):
name = grids[i]
i += 1
path = "./images/{}".format(name)
im = io.imread(path)
c = random.choice(changes)
if c == 1:
im[:, :, :] = im[::-1, :, :]
elif c == 2:
im[:, :, :] = im[:, ::-1, :]
elif c == 3:
im = transform.rotate(im, random.choice(angles), preserve_range=True)
black[unit*row:unit*(row+1),unit*col:unit*(col+1),:] = im[:,:,:]
return black
def adjuct(black, rownum, colnum):
u = 167
b = rgb2hsv(black)
vs = [1.1, 0.8] * ((rownum + 1) // 2)
vs = vs[:rownum]
vs = [x ** 1.1 for x in vs]
for i, v in enumerate(vs):
b[:, u*i:u*(i+1), 2] *= v
for j in range(colnum):
total_mean = b[:, j*u:(j+1)*u, 2].mean()
grids_mean = []
for i in range(rownum):
m = b[i*u:(i+1)*u, j*u:(j+1)*u, 2].mean()
grids_mean.append(m)
for i in range(rownum):
b[i*u:(i+1)*u, j*u:(j+1)*u, 2] *= total_mean / grids_mean[i]
b = hsv2rgb(b)
return b
def blackwhite(name):
original = io.imread(name)
grayscale = rgb2gray(original)
ts = 87 / 255
mask = grayscale > ts
grayscale[mask] = 1.0
mask = grayscale <= ts
grayscale[mask] = 0.0
grayscale = 1.0 - grayscale
return grayscale
def main(rownum, colnum, filename):
black = background(rownum, colnum)
black = adjuct(black, rownum, colnum)
black = rgb2gray(black)
chars = blackwhite(filename)
black = transform.resize(black, chars.shape)
mask_b = chars < 0.5
mask_w = chars >= 0.5
r = np.zeros((chars.shape), dtype=np.uint8)
r[:] = chars[:]*255
r[mask_b] = black[mask_b] * 255
r[mask_w] = r[mask_w] / 2 + (black[mask_w]* -1.0 + 1.0) * 120
plt.figure()
plt.imshow(r, cmap=plt.cm.gray)
plt.show()
io.imsave("output.jpg", r)
if __name__ == "__main__":
if len(sys.argv) != 4:
rownum = 6
colnum = 4
filename = "input.jpg"
else:
rownum = int(sys.argv[1])
colnum = int(sys.argv[2])
filename = sys.argv[3]
main(rownum, colnum, filename)