庖丁解牛——使用Python分割图片

当A0图纸遇到A4打印机和老眼昏花是恐怕就是小年轻也要跳起来说看不清。没关系我们用Python的OpenCV库可以很方便的庖丁解牛,把大图分割成几张大小相同的小图,而后在保证分辨率的前提下打印出来。

为了简单期间,此处程序直接固定读取存放在路径:D:\data\pic下名字为000.jpg的图片,而后切割好的的图片放到目录D:\data\output\pic下。

好了废话不多说,上程序:

import cv2

picture_path = r"d:/data/pic/000.jpg"
picture_save_path = r"d:/data/output/pic"
#参数列表 Vnumber:纵向图片数量
#   VSize:图片大小,A3L 为A3纵向
#                  A3W  A3横向
#                  A4L  A4纵向
#                  A4W  A4横向
Vnumber=4
VSize='A4W'


target_channel = 3
picture = cv2.imread(picture_path)

H = picture.shape[0]
W = picture.shape[1]
C = picture.shape[2]

C_number = C
print("像素行数={}".format(H))
print("像素列数={}".format(W))
print("像素色域通道数={}".format(C))

H_number=Vnumber
VPSize=H/Vnumber
if(VSize=='A3L'):
    W_number=int(W/VPSize*(42/29.7)+0.5)
if(VSize=="A3W"):
    W_number =int( W /VPSize * (29.7 /42)+0.5)
if(VSize=='A4L'):
    W_number=int(W/VPSize*(29.7/21)+0.5)
if(VSize=="A4W"):
    W_number =int( W /VPSize * (21 /29.7)+0.5)

target_width = int(W/W_number)
target_high = int(VPSize)

for i in range(0, H_number):
    for j in range(0, W_number):
         mask = picture[i * target_high:(i + 1) * target_high, j * target_width:(j + 1) * target_width, :]
         save_picture =picture_save_path +"_{}_{}.jpg".format(i + 1, j + 1)
         cv2.imwrite(save_picture, mask)


print("finished!!!")

实际使用时,可通过修改Vnumber和VSize来设定输出小图的数量和幅面大小。 其中:

Vnumber是垂直方向上切割图片的数量。程序可自行计算水平所需的图片数量,以保证图片的纵横比不变化。

VSize是输出小图的幅面类型,这里程序中预设了A3,A4两种幅面,纵向和横向两种板式共四种输出类型。

下面我们验证一下程序。以一张民国时期的老南京地图为例,按垂直方向切割为4份A4横向幅面小图
;例图
切割后小图如下
在这里插入图片描述

切图成功,以后再也不会为硬件工程师画的A0图纸不好打印发愁了。

后记

本文于2024.2.20 日首发于“车灯电子扫地僧”。 如果你喜欢我的文章,也可以“车灯电子扫地僧”搜索微信订阅号。更多文章等待您的发掘.

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值