Tổng quan về đồ án 1, Lý do chọn đề tài Do tình hình dịch Covid19 kéo dài, ảnh hưởng rất lớn tới đời sống sinh hoạt hàng ngày của chúng ta. Trong đó có việc học tập của học sinh, sinh viên. Mỗi khi đến giờ làm bài tập hay kiểm tra, việc viết bài ra giấy, chụp scan lưu sang file pdf rồi nộp bài tốn khá nhiều thời gian. Thấu hiểu độ lười biếng của sinh viên, học sinh, về việc chép phạt hoặc với yêu cầu bài tập của giáo viên với làm ra giấy chụp scan thì mọi người sẽ thích lựa chọn làm trên word hơn vì nó nhanh tiện lợi, copy, paste..Với lý do như trên nhóm em đã xuất phát và ra ý tưởng chuyển văn bản từ word (text) thành chữ viết tay (handwriting). II, Hướng giải quyết vấn đề
Trang 1
BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
BÁO CÁO ĐỒ ÁN
Môn học : Chuyên đề xử lý tín hiệu và truyền thông
Đề tài: Chuyển văn bản từ word thành chữ viết tay
(Text-to-Handwriting)
1
Trang 2Mục lục
I, Tổng quan về đồ án 3
1, Lý do chọn đề tài 3
II, Hướng giải quyết vấn đề 3
1, Ý tưởng thực hiện ban đầu: 3
2, Chuẩn bị dữ liệu (data) 3
3 Tiền xử lý data 7
4 Chương trình hàm chính Text-to-Handwriting 12
III Kết quả và Đánh giá 14
1.Trình bày thử nghiệm sản phẩm 14
2 Mô tả các số liệu đánh giá sản phẩm và phân tích 16
LỜI CẢM ƠN 17
2
Trang 3I, Tổng quan về đồ án
1, Lý do chọn đề tài
- Do tình hình dịch Covid-19 kéo dài, ảnh hưởng rất lớn tới đời sống sinh hoạt hàng ngày của chúng ta Trong đó có việc học tập của học sinh, sinh viên Mỗi khi đến giờ làm bài tập hay kiểm tra, việc viết bài ra giấy, chụp scan lưu sang file pdf rồi nộp bài tốn khá nhiều thời gian Thấu hiểu độ lười biếng của sinh viên, học sinh, về việc chép phạt hoặc với yêu cầu bài tập của giáo viên với làm ra giấy chụp scan thì mọi người sẽ thích lựa chọn làm trên word hơn vì nó nhanh tiện lợi, copy, paste Với lý do như trên nhóm em đã xuất phát và ra ý tưởng chuyển văn bản từ word (text) thành chữ viết tay (handwriting).
II, Hướng giải quyết vấn đề
1, Ý tưởng thực hiện ban đầu:
- Sử dụng ngôn ngữ Python để xây dựng code lấy và mã hóa chữ viết tay, sau đó xây dựng tiếp code chương trình chuyển chữ text thành chữ viết tay.
- Chữ text sẽ là một bản text được gõ bằng bàn phím và kết quả là một file ảnh hoặc pdf chữ viết tay với nội dung giống 100% bản text.
2, Chuẩn bị dữ liệu (data)
- Sử dụng bảng chữ cái tiếng Việt và các dấu, các ký tự đặc biệt trên bàn phím ( tổng cộng 205 ký tự) do bảng chữ cái Tiếng anh rất ít ký tự.
3
Trang 4Ảnh: Các ký tự in hoa và in thường của bảng chữ cái tiếng Anh
- Viết các chữ, số và dấu lên một nền trắng, mỗi ký tự 3 lần trên giấy nền trắng sau
đó scan lại thành một file ảnh hoặc là viết trực tiếp các ký tự bằng bút điện tử trên các trang text trong các ứng dụng trong các thiết bị thông minh.
- Toàn bộ ảnh các ký tự để cắt:
4
Trang 83 Tiền xử lý data
* Cắt từng ký tự thành một ảnh riêng: sử dụng code Python để xây dựng chương trình cắt, dùng chuột để cắt từng ký tự đã viết bằng cách bấm giữ chuột kéo từ trái sang phải để tạo phần cắt sau đó thả ra để tự động lưu vào một folder đã tạo từ trước.
- Code cắt ảnh:
#!/usr/bin/env python3
import cv2
import numpy as np
import os
cropping = False
x_start, y_start, x_end, y_end = 0 0 0 0
img_counter = 0
image = cv2.imread('/Users/tinasoft/Downloads/bang chu cai 1.png') # đường dẫn ảnh
path = '/Users/tinasoft/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/data' # đường dẫn folder lưu ảnh
oriImage = image.copy()
def mouse_crop(event, , , flags, param):
global x_start, y_start, x_end, y_end, cropping, img_counter
if event == cv2.EVENT_LBUTTONDOWN: # nếu nút chuột trái là xuống, hãy bắt đầu ghi giá toạ độ
x_start, y_start, x_end, y_end = x, , ,
cropping = True
elif event == cv2.EVENT_MOUSEMOVE: # Chuột đang di chuyển
if cropping == True:
x_end, y_end = x,
elif event == cv2.EVENT_LBUTTONUP: # nếu nút chuột trái được thả
x_end, y_end = x, y # ghi lại tọa độ kết thúc (x, y)
cropping = False
refPoint = [(x_start, y_start), (x_end, y_end)]
if len(refPoint) == 2:
img_cut = oriImage[refPoint[0][1]:refPoint[1][1],
refPoint[0][0]:refPoint[1][0]] # cắt ảnh copy theo toạ độ được ghi
cv2.imshow("Cropped", img_cut)
img_name = "{}B18DCDT100BS.png".format(img_counter) # sửa thành msv của mọi người
cv2.imwrite(os.path.join(path, img_name), img_cut)
img_counter += 1
def main():
cv2.namedWindow("image")
cv2.setMouseCallback("image", mouse_crop)
while True:
i = image.copy()
if not cropping:
cv2.imshow("image", image)
elif cropping:
cv2.rectangle(i, (x_start, y_start), (x_end, y_end), (255, , 0), )
cv2.imshow("image", i)
key = cv2.waitKey(1)
if key == ord('q'): # nhấn q để thoát
print("thoát")
8
Trang 9break
cv2.destroyAllWindows()
if _name_ == '_main_':
main()
- Kết quả:
* Sau đó sử dụng code để đưa tất cả các ảnh đã cắt về thành một size duy nhất nhằm tránh tình trạng các ký tự bị lệch nhau ở kết quả.
- Code đổi size ảnh:
- import os
from PIL import Image
def Resize_hsize(hsize, path_img): # hàm đổi size ảnh theo chiều cao
img = Image.open(path_img)
wpercent = (hsize / float(img.size[1]))
basewidth = int((float(img.size[0]) * float(wpercent)))
img = img.resize((basewidth, hsize), Image.ANTIALIAS)
img.save(path_img)
def Resize_basewidth(basewidth, path_img): # hàm đổi size ảnh theo chiều rộng
img = Image.open(path_img)
wpercent = (basewidth / float(img.size[0]))
hsize = int((float(img.size[1]) * float(wpercent)))
img = img.resize((basewidth, hsize), Image.ANTIALIAS)
img.save(path_img)
9
Trang 10def Resizefolder(path): # hàm đổi size nhiều ảnh trong 1 folder
os.chdir(path)
for file in os.listdir():
if file.endswith(".png") or file.endswith(".jpg") or file.endswith(".jpeg"):
print(os.path.join(path, file))
path_img = os.path.join(path, file)
Resize_hsize(100, path_img) # tuỳ chọn hàm đổi size theo chiều cao hay chiều rộng
def main():
path = "/Users/abc/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn
Hưng/data_test"
Resizefolder(path) # nếu đổi size 1 ảnh thì gọi hàm Resize_hsize hoặc Resize_basewidth
if _name_ == '_main_':
main()
- Kết quả:
* Cuối cùng là mã hóa mỗi ký tự để có thể xây dựng code hoàn chỉnh ( ví dụ như E là 69, e
là 101,….)
- Code mã hóa kí tự:
- # Importing Library
from sys import argv
import openpyxl
output_excel_path = '/Users/abc/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/kí tự.xlsx'
def output_Excel(input_detail, output_excel_path):
# Xác định số hàng và cột lớn nhất trong file excel cần tạo
row = len(input_detail)
column = len(input_detail[0])
# Tạo một workbook mới và active nó
wb = openpyxl.Workbook()
ws = wb.active
# Dùng vòng lặp for để ghi nội dung từ input_detail vào file Excel
for i in range(0 row):
10
Trang 11for j in range(0 column):
v = input_detail[i][j]
ws.cell(column=j + 1 row=i + 1 value=v)
# Lưu lại file Excel
wb.save(output_excel_path)
def Text_code(path_txt):
dem = 0
d = dict()
with open(path_txt, mode="r", encoding="utf-8") as file:
txt = file.read()
print(txt)
for i in txt:
if ord(i) == 32 or ord(i) == 10:
continue
dem += 1
d[ord(i)] = i
print(dem)
items_sorted = sorted(d.items())
for i in items_sorted:
print(i)
output_Excel(items_sorted, output_excel_path)
def main():
path_txt = "/Users/abc/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/kí tự.txt"
Text_code(path_txt)
if _name_ == '_main_':
main()
- Ví dụ một số chữ cái mã hóa:
11
Trang 134 Chương trình hàm chính Text-to-Handwriting
- Input: Một bản text được nhập từ bàn phím
- Nguyên tắc hoạt động của code: đầu tiên tạo ra một ảnh trắng có kích thước là một tờ A4 sau đó lấy văn bản text đã nhập vào Tiếp đó là duyệt và nhận diện lần lượt từng ký
tự rồi theo bảng mã hóa đã xây dựng để lấy ảnh đã cắt được lưu trong folder, cuối cùng
là ghép vào ảnh trắng đã tạo Cứ lặp lại từng ký tự như vậy cho đến khi hoàn thành 100% nội dung input.
- Code chuyển từ chữ text sang chữ viết tay:
- # Importing Library
from PIL import Image
from sys import argv
import os
from docx import Document
import random
def PNG_PDF(PNG_FILE):
rgba = Image.open(PNG_FILE)
print(rgba)
rgb = Image.new('RGB', (2632, 3176), (255, 255, 255))
rgb.paste(rgba)
PDF_FILE = PNG_FILE.replace(".png", ".pdf")
rgb.save(PDF_FILE, 'PDF', resoultion=100.0)
def Text_To_Handwriting(path_txt, path_data, chieucao, path_out):
img_counter = 1
A4_List = []
if path_txt.endswith(".txt"):
with open(path_txt, "r") as file:
txt = file.read()
elif path_txt.endswith(".docx"):
document = Document(path_txt)
txt = ''
for p in document.paragraphs:
txt += p.text + "\n"
A4_name = "A4T{}".format(img_counter)
print(A4_name)
A4_name = Image.new('RGB', (2632, 3176), (255, 255, 255))
A4_List.append(A4_name)
sheet_width = A4_name.width
Horizontal, vertical = 0 0
for i in txt:
# print(i, ord(i))
if vertical > (3176 // chieucao - 2) * chieucao:
img_counter += 1
A4_name = "A4T{}".format(img_counter)
print(A4_name)
A4_name = Image.new('RGB', (2632, 3176), (255, 255, 255))
A4_List.append(A4_name)
13
Trang 14Horizontal = 0
vertical = 0
if ord(i) == 10:
Horizontal = 0
vertical += chieucao
continue
try:
cases = Image.open(path_data + "{}-{}.png".format(str(ord(i)), random.randint(1 3)))
A4_name.paste(cases, (Horizontal, vertical))
size = cases.width
height = cases.height
Horizontal += size
if ord(i) == 32 and (sheet_width - Horizontal) < size * 5:
Horizontal = 0
vertical += chieucao
except Exception as e:
print(e, "không có kí tự {} {} trong data".format(i, ord(i)))
A4_counter = 1
for A4 in A4_List:
A4.show()
path_A4 = os.path.join(path_out, "A4T{}".format(A4_counter) + ".png")
A4_counter += 1
A4.save(path_A4)
def main():
path_txt = "/Users/tinasoft/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/testword.docx" # đường dẫn file word hoặc txt
path_data = "/Users/tinasoft/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/data/" # đường dẫn data
path_out = "/Users/tinasoft/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/A4/" # đường dẫn lưu
chieucao = 100
Text_To_Handwriting(path_txt, path_data, chieucao, path_out)
PNG_PDF("/Users/tinasoft/Documents/Code_doAn/Text-to-Handwriting-master/N01n01_Đặng Văn Hưng/A4/A4T1.png")
if _name_ == '_main_':
main()
- Output: file pdf hoặc png (là các tờ A4 scan) giống 100% nội dung Input
14
Trang 15III Kết Quả và Đánh Giá
1.Trình bày thử nghiệm sản phẩm
-Kết quả khi trang word ngắn và đoạn text nằm trong 1 trang A4:
- Kết quả khi trang word dài và hơn 1 trang thì sẽ tự động cắt và chuyển sang thành nhiều trang A4:
15
Trang 172 Mô tả các số liệu đánh giá sản phẩm và phân tích
- Trong quá trình gán nhãn data sẽ gây ra sai số và nhầm lẫn, Vì thế nên khi chuyển đổi dữ liệu sẽ đúng được 98%.Qua đó rút ra được những ưu và nhược điểm là:
- Ưu Điểm: Tiện lợi
+ Tự động xuống dòng
+ Tự động tạo thêm trang.
- Nhược Điểm:
+ Các chữ sẽ bị giống nhau do đó giải pháp khắc phục là Mỗi ký tự đã được viết
3 lần khác nhau, khi tìm đến các ký tự được mã hóa đó sử dụng random để lấy 1 trong 3
ký tự.
+ Chưa đọc được các ký tự hình học, toán học nên cần xây dựng thêm nguồn Data.
+ Quá trình thu nhập data vẫn còn thủ công.
17
Trang 18LỜI CẢM ƠN
Lời đầu tiên, chúng em xin gửi lời cảm ơn chân thành nhất đến Học Viện Công nghệ Bưu chính Viễn thông đã đưa môn học Truyền Thông Đa Phương Tiện vào trong chương trình giảng dạy của nhà trường Đặc biệt, chúng em xin gửi lời cảm ơn đến thầy
Vũ Hữu Tiến là giảng viên bộ môn đã giảng dạy và truyền cho chúng em những kiến thức đáng quý trong suốt quá trình học vừa qua Trong thời gian tham dự lớp học của thầy, chúng em đã tiếp thu được những kiến thức quý báu về học tập và làm việc theo tác phong nghiêm túc Đây thực là một điều đáng quý trong suốt quá trình học tập và sau này khi đi làm của cả nhóm Bộ môn Truyền Thông Đa Phương Tiện là môn học rất thú vị, vô cùng tốt và gắn liền với nhu cầu thực tiễn của mỗi sinh viên Do thời gian học tập và tìm hiểu còn có hạn, vì vậy bài báo cáo của chúng em khó tránh khỏi những thiếu sót và nhiều chỗ chưa chuẩn xác, kính mong thầy xem xét và góp ý giúp bài báo cáo của chúng
em được hoàn thiện hơn
Sinh viên nhóm 12 xin chân thành cảm ơn Thầy ạ!
18