python实现书法碑帖图片分割
作者:傅佑 发布时间:2023-09-12 16:08:02
标签:python,图片分割
本文实例为大家分享了python实现书法碑帖图片分割的具体代码,供大家参考,具体内容如下
一、功能实现效果
1、选择要分割的碑帖图片
2、选择碑帖图像分割的行与列,本例的行为:5,列为:4。如何点击“确定行列”
3、输入对于碑帖的内容,点击“确定分割”按钮。
4、在输出文件夹生成了单字版图片,并对应内容命名。方便集字、创作与学习。
二、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


猜你喜欢
- 递归函数及递归次数受到限制一个函数在内部调用自己,那么这个函数是递归函数。递归会反复使用本身,每递归一次,越接近最终的值。当一个问题可以由许
- PHP信息函数包含的一些函数概念总结如下。PHP信息函数之getenv适用版本:PHP3, PHP4函数功能:取得环境变量数值。函数语法:s
- 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server se
- 最近在学习机器学习的过程中,常常需要将本地写的代码传到GPU服务器中,然后在服务器上运行。之前的做法一直是先在本地写好代码,然后通过File
- 目录一、善用组件让代码更有条理性1、 提取UI组件2、按模块提取业务组件3、按功能提取功能组件二、利用v-bind使组件的属性更具有可读性三
- tensorflow里面给出了一个函数用来读取图像,不过得到的结果是最原始的图像,是咩有经过解码的图像,这个函数为tf.gfile.Fast
- 背景之前是用的是typora来写的文章,最近typora最近开始收费了,所以就不想用了,于是找到了一个替代品MarkText,感觉跟typo
- 相同点:可以利用中括号获取元素 s[0]可以的得到单个元素 或 一个元素切片 s[3,7]可以遍历 for x in s可以调用同样的函数获
- Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件。优势:资源丰富,适合快速开
- PyAutoGUI 不知道你有没有用过,它是一款用Python自动化控制键盘、鼠标的库。但凡是你不想手动重复操作的工作都可以用这个库来解决。
- 本文实例为大家分享了Pyqt实现简易计算器的具体代码,供大家参考,具体内容如下环境:pycharm、python3.7首先用qtDesign
- 今天周五,很闲,坐在电脑前没什么事可做,产品线的人也没提什么新的需求,可能下周会有新的需求和工作安排,但那是下周的事了。今天就想写点技术的东
- 安装 setuptools 工具任务时间:1min ~ 5min安装yum install python-setuptools -y因为之后
- 以下是我做美工的两年生活中一条条总结出来的经验,每一点都是我常用的,虽然不是什么大学问,但我觉得要互相学习才能提高,所以现在拿出来和大家一起
- 前言本文将使用pytorch框架的目标识别技术实现滑块验证码的破解。我们这里选择了yolov5算法例:输入图像输出图像可以看到经过检测之后,
- 深藏多年秘笈大公开,全世界唯一一家公布,怎么点就是点不出,纯CSS去掉按钮或者链接点击产生的虚线。运行代码框<style type=&
- 随着手机用户的不断增加,WAP站点如雨后春笋迅速的滋长开来,手机邮箱也不断的出现在人的眼前,笔者也曾经开发了一套手机邮箱的系统,但由于时间仓
- 找遍资料得出结果:不能 不过同时也找到了解决办法,就是用iframe的方式来提交表单,即实现无刷新提交表单又可以上传文件! 一、HTML代码
- 简单的测试用例#!/usr/bin/python# -*- coding: UTF-8 -*-import timefrom pymongo
- 本文实例为大家分享了python爬取淘宝商品的具体代码,供大家参考,具体内容如下import requests as req import