1. 前言
为了给图片添加网格线,用刚学的python写了一段代码,使用到了matplotlib与numpy。过程大致如下:
- 首先,确定网格线所在的位置(用range生成一列等跨度数据即可)
- 然后,根据线宽生成需要绘制网格线像素的坐标位置
- 最后,填色,输出文件
效果如下:
处理前 | 处理后 |
---|---|
2. 代码
import numpy as np
import matplotlib.image as mpig
import matplotlib.pyplot as plt
import math
from os.path import splitext # 用于导出文件
# 定义参数
FILENAME = '图片名称.png'
# LWIDTH_P=0.01 # 网格线宽占短边百分比(以短边为参考,不使用时注释该行)
LWIDTH_X=1 # 网格线宽,以像素为单位
LCOLOR=(0, 47, 167) # 网格线颜色RGB
XY=(8,8) # 划分为X列Y行
'''
X为宽,Y为高
╆━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━>
┃ | | |
┃ | | |
┃------------------------------------ Y=2
┃ | | |
┃ | | |
┃------------------------------------
┃
v X=3
'''
path_splt=splitext(FILENAME)
img_mpig = mpig.imread(FILENAME)
im_shape = img_mpig.shape
height = im_shape[0]
width = im_shape[1]
color_R = LCOLOR[0]
color_G = LCOLOR[1]
color_B = LCOLOR[2]
# PNG文件使用浮点数
if path_splt[1]=='.png' or path_splt[1]=='.PNG':
color_R = LCOLOR[0]/255
color_G = LCOLOR[1]/255
color_B = LCOLOR[2]/255
def get_index_wh(wh_array, LWIDTH_X):
'''
获取所有线段索引位置
参数
---
wh_array : 网格线中心索引
LWIDTH : 以像素为单位的线宽
'''
index_wh=wh_array-int(LWIDTH_X/2) # 起始索引位置
index_out=index_wh # array不能为空
for i in range(LWIDTH_X):
tmp=index_wh+i
index_out=np.append(index_out,tmp)
return index_out
# 规范化参数
X=XY[0]
Y=XY[1]
grid_width_remainder=width%X
grid_height_remainder=height%Y
grid_width = int((width-grid_width_remainder)/X)
grid_height = int((height-grid_height_remainder)/Y)
# 线宽中心位置索引
def get_array_center(wh,grid_wh,remainder):
l=list(range(0,wh,grid_wh))
l.pop(0)
if(remainder!=0):
l.pop()
return np.array(l)
width_array=get_array_center(width,grid_width,grid_width_remainder)
height_array=get_array_center(height,grid_height,grid_height_remainder)
# 规范化线段宽度,得到所有线段索引位置
if 'LWIDTH_P' in dir(): # 若定义了百分比宽度
if(width<height):
LWIDTH_X=math.ceil(width*LWIDTH_P)
else:
LWIDTH_X=math.ceil(height*LWIDTH_P)
index_w = get_index_wh(width_array, LWIDTH_X)
index_h = get_index_wh(height_array, LWIDTH_X)
# 填色
for x in index_w:
for y in range(height):
img_mpig[y,x,:]=np.array([color_R,color_G,color_B])
for x in range(width):
for y in index_h:
img_mpig[y,x,:]=np.array([color_R,color_G,color_B])
plt.imshow(img_mpig)
plt.show()
plt.imsave(path_splt[0]+'_grid'+path_splt[1],img_mpig)
PNG图片实测有效