python实现书法碑帖图片分割

作者:傅佑 时间:2023-09-12 16:08:02 

本文实例为大家分享了python实现书法碑帖图片分割的具体代码,供大家参考,具体内容如下

一、功能实现效果

1、选择要分割的碑帖图片

python实现书法碑帖图片分割

2、选择碑帖图像分割的行与列,本例的行为:5,列为:4。如何点击“确定行列”

python实现书法碑帖图片分割

3、输入对于碑帖的内容,点击“确定分割”按钮。

python实现书法碑帖图片分割

python实现书法碑帖图片分割

python实现书法碑帖图片分割

4、在输出文件夹生成了单字版图片,并对应内容命名。方便集字、创作与学习。

python实现书法碑帖图片分割

二、Python代码实现

1、getimgdir.py


import wx
import os
from PIL import Image
import numpy as np
#import wx.grid
#import row_col
#row_col
#######################################################################################
app = wx.App() #wx.App()行创建了一个应用程序对象。每个 wx 程序都需要一个 .App() 对象
frame = wx.Frame(None, -1, '请选择待分割的图片文件') #wx.Frame()方法返回一个可以包含小部件的新窗口
frame.SetSize(0,0,600,300) #函数设置位置和大小(x(左),y(顶部),宽度,高度)
openFileDialog = wx.FileDialog(frame, "Open", "", "",
                  "all files (*.*)|*.*",
                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

openFileDialog.ShowModal() #显示窗口
src = openFileDialog.GetPath() #返回文件的完整路径(如果选择了一个)
np.savez('dir.npz', k_a=src)
openFileDialog.Destroy()

2、row_col.py


import wx
import numpy as np
import sys
import time
import os
class MyFrame(wx.Frame):
 ClickNum = 0
 def __init__(self):   #__init__(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法。__init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。
   super().__init__(parent=None,title="图像分割行数与列数",size=(500,730)) # 初始化窗口信息
   panel = wx.Panel(self)  #框架的父窗口。对于顶级窗口,这个值是None 。#创建面板
   #模块1 选择签约主体
   self.Center()
   text1 = wx.StaticText(parent=panel,id=-1,pos=(10,7),label="图像分割行数:")
   list1 = ["1","2","3","4","5","6","7","8","9","10"]
   self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value="5",choices=list1)#wx.ComboBox 默认它的文本框是可以修改的

text2 = wx.StaticText(parent=panel, id=-1, pos=(250, 7), label="图像分割列数:")
   list2 = ["1","2","3","4","5","6","7","8","9","10"]
   self.combobox2 = wx.ComboBox(parent=panel, id=-1, pos=(350, 5), value="4",choices=list2) # wx.ComboBox 默认它的文本框是可以修改的

datadir = np.load('dir.npz')
   imgdir = str(datadir['k_a'])
   copybookimg = wx.Bitmap(imgdir, wx.BITMAP_TYPE_ANY)
   img = wx.Image(imgdir)
   w1,h1 = copybookimg.GetSize()
   if h1>400:
    neww1 = (400*w1)/h1
    newh1 = 400
    img2=img.Scale(int(neww1),newh1)
    img2=wx.Bitmap(img2)
    self.image = wx.StaticBitmap(panel, -1, img2,pos=(10, 90))

st1 = wx.StaticText(panel, -1, "字帖内容:", pos=(10, 505))

self.txt1 = wx.TextCtrl(panel, -1, pos=(60, 530), size=(int(13.26*1+23.5), 140), style=wx.TE_MULTILINE)

#提交模块
   self.button = wx.Button(panel, -1, "确定行列", pos=(200, 40), size=(60, 30)) # 在面板上添加控件
   self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) # 将回调函数与按键事件绑定

def OnClick(self, event): # 回调函数事件
     self.button.SetLabel("提交成功") # 设置
     self.ClickNum += 1
     if self.ClickNum % 2 == 1: # 根据按下次数判断
       self.button.SetLabel("已经提交") # 修改按键的标签
       a = self.combobox1.GetValue()
       b = self.combobox2.GetValue()
       np.savez('abc.npz', k_a=a, k_b=b)
       #time.sleep(0.1)
       self.Close()

class App(wx.App):
 def OnInit(self):
   frame = MyFrame()
   frame.Show()
   return True
app = App()
app.MainLoop()
#time.sleep(2)
#sys.exit(0)

3、row_col_show.py


import wx
import numpy as np
import threading
import time
from PIL import Image,ImageDraw
def draw_line(dir,a,b):
im = Image.open(dir)
draw = ImageDraw.Draw(im) #实例化一个对象
#a #行 图像的宽:im.size[0]
#b #列 图像的高:im.size[1]
a=int(a)
b=int(b)
c=im.size[0]
d=im.size[1]
for i in range(a):
 draw.line((0, d*(i+1)/a) + (c,d*(i+1)/a), fill=128, width=5) #线的起点和终点,线宽
for j in range(b):
 draw.line((c*(j+1)/b,0) + (c*(j+1)/b,d), fill=128, width=6)
return(im.save("00.jpeg"))

class MyFrame(wx.Frame):
 ClickNum = 0

def __init__(
     self): # __init__(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法。__init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。
   super().__init__(parent=None, title="图像分割行数与列数", size=(500, 730)) # 初始化窗口信息
   panel = wx.Panel(self) # 框架的父窗口。对于顶级窗口,这个值是None 。#创建面板
   # 模块1 选择签约主体
   self.Center()
   data_a = np.load('abc.npz')
   split_row = int(data_a['k_a']) # 读取行数
   split_col = int(data_a['k_b']) # 读取列数

text1 = wx.StaticText(parent=panel, id=-1, pos=(10, 7), label="图像分割行数:")
   list1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
   self.combobox1 = wx.ComboBox(parent=panel, id=-1, pos=(100, 5), value=str(split_row),
                  choices=list1) # wx.ComboBox 默认它的文本框是可以修改的

text2 = wx.StaticText(parent=panel, id=-1, pos=(250, 7), label="图像分割列数:")
   list2 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
   self.combobox2 = wx.ComboBox(parent=panel, id=-1, pos=(350, 5), value=str(split_col),
                  choices=list2) # wx.ComboBox 默认它的文本框是可以修改的
   datadir = np.load('dir.npz')
   imgdir = str(datadir['k_a'])
   copybookimg = wx.Bitmap(imgdir, wx.BITMAP_TYPE_ANY)
   #img = wx.Image(imgdir)
   draw_line(imgdir, str(split_row), str(split_col))
   img3 = wx.Image("00.jpeg")
   w1, h1 = copybookimg.GetSize()
   if h1 > 400:
     neww1 = (400 * w1) / h1
     newh1 = 400
     img2 = img3.Scale(neww1, newh1)
     img2 = wx.Bitmap(img2)
     self.image = wx.StaticBitmap(panel, -1, img2, pos=(10, 90))
   st1 = wx.StaticText(panel, -1, "字帖内容:", pos=(10, 505))
   for i in range(split_col):
     wx.StaticText(panel, -1, "第"+str(i+1)+"列:", pos=(10, 530+20*i))

self.txt1 = wx.TextCtrl(panel, -1, pos=(60, 530), size=(13.26 * split_row + 23.5, split_col *20), style=wx.TE_MULTILINE)

# 提交模块
   self.button = wx.Button(panel, -1, "确定分割", pos=(400, 650), size=(60, 30)) # 在面板上添加控件
   self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) # 将回调函数与按键事件绑定

def OnClick(self, event): # 回调函数事件
   self.button.SetLabel("提交成功") # 设置
   self.ClickNum += 1
   if self.ClickNum % 2 == 1: # 根据按下次数判断
     self.button.SetLabel("已经提交") # 修改按键的标签
     a = self.combobox1.GetValue()
     b = self.combobox2.GetValue()
     c = self.txt1.GetValue()
     np.savez('abc.npz', k_a=a, k_b=b, k_c=c) #k_c = c碑帖内容保存npz文件
     self.Close()
class App(wx.App):
 def OnInit(self):
   frame = MyFrame()
   frame.Show()
   return True
app = App()
app.MainLoop()

4、split_copybook.py


# -*- coding: utf-8 -*-

import wx
import os
from PIL import Image
import numpy as np
#import wx.grid
#import row_col
#row_col
#######################################################################################
data_a = np.load('dir.npz')
src=str(data_a['k_a'])#地址

def splitimage(src, rownum, colnum, dstpath): #分割图像,(输入图片路径,分割行数,分割列数,输出图片路径)

img = Image.open(src)
 src=src.replace('jpg','jpeg')

print(src)
 #os.getcwd()
 w, h = img.size
 if rownum <= h and colnum <= w:
   print('原碑帖图片信息: %sx%s, %s, %s' % (w, h, img.format, img.mode))
   print('

5、main.py


import os
os.system("python ./getimgdir.py")
os.system("python ./row_col.py")
os.system("python ./row_col_show.py")
os.system("python ./split_copybook.py")
os.unlink('00.jpeg')
os.unlink('abc.npz')
os.unlink('dir.npz')

来源:https://blog.csdn.net/weixin_43756157/article/details/114384721

标签:python,图片分割
0
投稿

猜你喜欢

  • 聊聊Python对CSV文件的读取与写入问题

    2023-09-26 09:42:29
  • python中字典增加和删除使用方法

    2023-12-15 15:31:30
  • python实现感知器算法(批处理)

    2022-09-06 18:02:25
  • Windows 版本Git命令行的使用详解

    2023-11-16 10:25:39
  • Python+OpenCV进行人脸面部表情识别

    2021-07-18 22:47:35
  • 基于keras中import keras.backend as K的含义说明

    2023-04-28 08:43:27
  • Python命令行定时任务自动化工作流程

    2023-01-01 20:52:51
  • Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程

    2023-01-11 13:45:04
  • MySQL存储过程中使用动态行转列

    2024-01-16 22:03:16
  • SWFObject1.5: 基于Javascript的Flash媒体版本检测与嵌入模块

    2009-08-06 18:02:00
  • MySQL RC事务隔离的实现原理

    2024-01-29 06:12:23
  • 全面解析Bootstrap中tab(选项卡)的使用方法

    2024-05-03 15:03:48
  • Python中设置变量访问权限的方法

    2023-09-13 15:42:15
  • PHP curl get post 请求的封装函数示例【get、post、put、delete等请求类型】

    2023-05-25 01:24:18
  • 通过yum方式安装mySql数据库的全过程

    2024-01-13 11:46:43
  • MySQL数据库之索引详解

    2024-01-14 20:57:46
  • Python Matplotlib绘制多子图详解

    2021-01-11 11:27:05
  • selenium中常见的表单元素操作方法总结

    2021-06-15 23:54:32
  • 利用Python读取Excel表内容的详细过程

    2022-10-24 05:43:33
  • Python绘画好看的星空图

    2021-11-22 12:48:12
  • asp之家 网络编程 m.aspxhome.com