【自用】利用Python对图片添加网格实线(改变选定点的像素颜色)

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图片实测有效

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值