千家信息网

python怎么实现分离图片和文字

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍"python怎么实现分离图片和文字",在日常操作中,相信很多人在python怎么实现分离图片和文字问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"pyt
千家信息网最后更新 2025年02月01日python怎么实现分离图片和文字

这篇文章主要介绍"python怎么实现分离图片和文字",在日常操作中,相信很多人在python怎么实现分离图片和文字问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"python怎么实现分离图片和文字"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

原图:

图片预处理:图片二值化以及图片降噪处理。

# 图片二值化def binarization(img,threshold):    #图片二值化操作    width,height=img.size    im_new = img.copy()    for i in range(width):        for j in range(height):            a = img.getpixel((i, j))            aa = 0.30 * a[0] + 0.59 * a[1] + 0.11 * a[2]            if (aa <= threshold):                im_new.putpixel((i, j), (0, 0, 0))            else:                im_new.putpixel((i, j), (255, 255, 255))    # im_new.show()  # 显示图像    return im_new
# 图片降噪处理def clear_noise(img):    # 图片降噪处理    x, y = img.width, img.height    for i in range(x-1):        for j in range(y-1):            if sum_9_region(img, i, j) < 600:                # 改变像素点颜色,白色                img.putpixel((i, j), (255,255,255))    # img = np.array(img)    #     # cv2.imwrite('handle_two.png', img)    #     # img = Image.open('handle_two.png')    img.show()    return img# 获取田字格内当前像素点的像素值def sum_9_region(img, x, y):    """    田字格    """    # 获取当前像素点的像素值    a1 = img.getpixel((x - 1, y - 1))[0]    a2 = img.getpixel((x - 1, y))[0]    a3 = img.getpixel((x - 1, y+1 ))[0]    a4 = img.getpixel((x, y - 1))[0]    a5 = img.getpixel((x, y))[0]    a6 = img.getpixel((x, y+1 ))[0]    a7 = img.getpixel((x+1 , y - 1))[0]    a8 = img.getpixel((x+1 , y))[0]    a9 = img.getpixel((x+1 , y+1))[0]    width = img.width    height = img.height    if a5 == 255:  # 如果当前点为白色区域,则不统计邻域值        return 2550    if y == 0:  # 第一行        if x == 0:  # 左上顶点,4邻域            # 中心点旁边3个点            sum_1 = a5 + a6 + a8 + a9            return 4*255 - sum_1        elif x == width - 1:  # 右上顶点            sum_2 = a5 + a6 + a2 + a3            return 4*255 - sum_2        else:  # 最上非顶点,6邻域            sum_3 = a2 + a3+ a5 + a6 + a8 + a9            return 6*255 - sum_3    elif y == height - 1:  # 最下面一行        if x == 0:  # 左下顶点            # 中心点旁边3个点            sum_4 = a5 + a8 + a7 + a4            return 4*255 - sum_4        elif x == width - 1:  # 右下顶点            sum_5 = a5 + a4 + a2 + a1            return 4*255 - sum_5        else:  # 最下非顶点,6邻域            sum_6 = a5+ a2 + a8 + a4 +a1 + a7            return 6*255 - sum_6    else:  # y不在边界        if x == 0:  # 左边非顶点            sum_7 = a4 + a5 + a6 + a7 + a8 + a9            return 6*255 - sum_7        elif x == width - 1:  # 右边非顶点            sum_8 = a4 + a5 + a6 + a1 + a2 + a3            return 6*255 - sum_8        else:  # 具备9领域条件的            sum_9 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9            return 9*255 - sum_9

经过二值化和降噪后得到的图片

对图片进行水平投影与垂直投影:

# 传入二值化后的图片进行垂直投影def vertical(img):    """传入二值化后的图片进行垂直投影"""    pixdata = img.load()    w,h = img.size    ver_list = []    # 开始投影    for x in range(w):        black = 0        for y in range(h):            if pixdata[x,y][0] == 0:                black += 1        ver_list.append(black)    # 判断边界    l,r = 0,0    flag = False    t=0#判断分割数量    cuts = []    for i,count in enumerate(ver_list):        # 阈值这里为0        if flag is False and count > 0:            l = i            flag = True        if flag and count == 0:            r = i-1            flag = False            cuts.append((l,r))#记录边界点            t += 1    #print(t)    return cuts,t# 传入二值化后的图片进行水平投影def horizontal(img):    """传入二值化后的图片进行水平投影"""    pixdata = img.load()    w,h = img.size    ver_list = []    # 开始投影    for y in range(h):        black = 0        for x in range(w):            if pixdata[x,y][0] == 0:                black += 1        ver_list.append(black)    # 判断边界    l,r = 0,0    flag = False    # 分割区域数    t=0    cuts = []    for i,count in enumerate(ver_list):        # 阈值这里为0        if flag is False and count > 0:            l = i            flag = True        if flag and count == 0:            r = i-1            flag = False            cuts.append((l,r))            t += 1    return cuts,t

这两段代码目的主要是为了分割得到水平和垂直位置的每个字所占的大小,接下来就是对预处理好的图片文字进行分割。

# 创建获得图片路径并处理图片函数def get_im_path():    OpenFile = tk.Tk()#创建新窗口    OpenFile.withdraw()    file_path = filedialog.askopenfilename()    im = Image.open(file_path)    # 阈值    th = getthreshold(im) - 16    print(th)    # 原图直接二值化    im_new1 = binarization(im, th)    im_new1.show()    # 直方图均衡化    im1 = his_bal(im)    im1.show()    im_new_np = np.array(his_bal(im))    th2 = getthreshold(im1) - 16    print(th2)    # 二值化    im_new = binarization(im1, th2)    # 降噪    im_new_cn = clear_noise(im_new)    height = im_new_cn.size[1]    print(height)    # 算出水平投影和垂直投影的数值    v, vt = vertical(im_new1)    h, ht = horizontal(im_new1)    # 算出分割区域    a = []    for i in range(vt):        a.append((v[i][0], 0, v[i][1], height))    print(a)    im_new.show()  # 直方图均衡化后再二值化    # 切割    for i, n in enumerate(a, 1):        temp = im_new_cn.crop(n)  # 调用crop函数进行切割        temp.show()        temp.save("c/%s.png" % i)

至此大概就完成了。

接下来是文件的全部代码:

import numpy as npfrom PIL import Imageimport queueimport  matplotlib.pyplot as pltimport  tkinter as tkfrom tkinter import filedialog#导入文件对话框函数库window = tk.Tk()window.title('图片选择界面')window.geometry('400x100')var = tk.StringVar()# 创建获得图片路径并处理图片函数def get_im_path():    OpenFile = tk.Tk()#创建新窗口    OpenFile.withdraw()    file_path = filedialog.askopenfilename()    im = Image.open(file_path)    # 阈值    th = getthreshold(im) - 16    print(th)    # 原图直接二值化    im_new1 = binarization(im, th)    im_new1.show()    # 直方图均衡化    im1 = his_bal(im)    im1.show()    im_new_np = np.array(his_bal(im))    th2 = getthreshold(im1) - 16    print(th2)    # 二值化    im_new = binarization(im1, th2)    # 降噪    im_new_cn = clear_noise(im_new)    height = im_new_cn.size[1]    print(height)    # 算出水平投影和垂直投影的数值    v, vt = vertical(im_new1)    h, ht = horizontal(im_new1)    # 算出分割区域    a = []    for i in range(vt):        a.append((v[i][0], 0, v[i][1], height))    print(a)    im_new.show()  # 直方图均衡化后再二值化    # 切割    for i, n in enumerate(a, 1):        temp = im_new_cn.crop(n)  # 调用crop函数进行切割        temp.show()        temp.save("c/%s.png" % i)# 传入二值化后的图片进行垂直投影def vertical(img):    """传入二值化后的图片进行垂直投影"""    pixdata = img.load()    w,h = img.size    ver_list = []    # 开始投影    for x in range(w):        black = 0        for y in range(h):            if pixdata[x,y][0] == 0:                black += 1        ver_list.append(black)    # 判断边界    l,r = 0,0    flag = False    t=0#判断分割数量    cuts = []    for i,count in enumerate(ver_list):        # 阈值这里为0        if flag is False and count > 0:            l = i            flag = True        if flag and count == 0:            r = i-1            flag = False            cuts.append((l,r))#记录边界点            t += 1    #print(t)    return cuts,t# 传入二值化后的图片进行水平投影def horizontal(img):    """传入二值化后的图片进行水平投影"""    pixdata = img.load()    w,h = img.size    ver_list = []    # 开始投影    for y in range(h):        black = 0        for x in range(w):            if pixdata[x,y][0] == 0:                black += 1        ver_list.append(black)    # 判断边界    l,r = 0,0    flag = False    # 分割区域数    t=0    cuts = []    for i,count in enumerate(ver_list):        # 阈值这里为0        if flag is False and count > 0:            l = i            flag = True        if flag and count == 0:            r = i-1            flag = False            cuts.append((l,r))            t += 1    return cuts,t# 获得阈值算出平均像素def getthreshold(im):    #获得阈值 算出平均像素    wid, hei = im.size    hist = [0] * 256    th = 0    for i in range(wid):        for j in range(hei):            gray = int(0.3 * im.getpixel((i, j))[0] + 0.59 * im.getpixel((i, j))[1] + 0.11 * im.getpixel((i, j))[2])            th = gray + th            hist[gray] += 1    threshold = int(th/(wid*hei))    return threshold# 直方图均衡化 提高对比度def his_bal(im):    #直方图均衡化 提高对比度    # 统计灰度直方图    im_new = im.copy()    wid, hei = im.size    hist = [0] * 256    for i in range(wid):        for j in range(hei):            gray = int(0.3*im.getpixel((i,j))[0]+0.59*im.getpixel((i,j))[1]+0.11*im.getpixel((i,j))[2])            hist[gray] += 1    # 计算累积分布函数    cdf = [0] * 256    for i in range(256):        if i == 0:            cdf[i] = hist[i]        else:            cdf[i] = cdf[i - 1] + hist[i]    # 用累积分布函数计算输出灰度映射函数LUT    new_gray = [0] * 256    for i in range(256):        new_gray[i] = int(cdf[i] / (wid * hei) * 255 + 0.5)    # 遍历原图像,通过LUT逐点计算新图像对应的像素值    for i in range(wid):        for j in range(hei):            gray = int(0.3*im.getpixel((i,j))[0]+0.59*im.getpixel((i,j))[1]+0.11*im.getpixel((i,j))[2])            im_new.putpixel((i, j), new_gray[gray])    return im_new# 图片二值化def binarization(img,threshold):    #图片二值化操作    width,height=img.size    im_new = img.copy()    for i in range(width):        for j in range(height):            a = img.getpixel((i, j))            aa = 0.30 * a[0] + 0.59 * a[1] + 0.11 * a[2]            if (aa <= threshold):                im_new.putpixel((i, j), (0, 0, 0))            else:                im_new.putpixel((i, j), (255, 255, 255))    # im_new.show()  # 显示图像    return im_new# 图片降噪处理def clear_noise(img):    # 图片降噪处理    x, y = img.width, img.height    for i in range(x-1):        for j in range(y-1):            if sum_9_region(img, i, j) < 600:                # 改变像素点颜色,白色                img.putpixel((i, j), (255,255,255))    # img = np.array(img)    #     # cv2.imwrite('handle_two.png', img)    #     # img = Image.open('handle_two.png')    img.show()    return img# 获取田字格内当前像素点的像素值def sum_9_region(img, x, y):    """    田字格    """    # 获取当前像素点的像素值    a1 = img.getpixel((x - 1, y - 1))[0]    a2 = img.getpixel((x - 1, y))[0]    a3 = img.getpixel((x - 1, y+1 ))[0]    a4 = img.getpixel((x, y - 1))[0]    a5 = img.getpixel((x, y))[0]    a6 = img.getpixel((x, y+1 ))[0]    a7 = img.getpixel((x+1 , y - 1))[0]    a8 = img.getpixel((x+1 , y))[0]    a9 = img.getpixel((x+1 , y+1))[0]    width = img.width    height = img.height    if a5 == 255:  # 如果当前点为白色区域,则不统计邻域值        return 2550    if y == 0:  # 第一行        if x == 0:  # 左上顶点,4邻域            # 中心点旁边3个点            sum_1 = a5 + a6 + a8 + a9            return 4*255 - sum_1        elif x == width - 1:  # 右上顶点            sum_2 = a5 + a6 + a2 + a3            return 4*255 - sum_2        else:  # 最上非顶点,6邻域            sum_3 = a2 + a3+ a5 + a6 + a8 + a9            return 6*255 - sum_3    elif y == height - 1:  # 最下面一行        if x == 0:  # 左下顶点            # 中心点旁边3个点            sum_4 = a5 + a8 + a7 + a4            return 4*255 - sum_4        elif x == width - 1:  # 右下顶点            sum_5 = a5 + a4 + a2 + a1            return 4*255 - sum_5        else:  # 最下非顶点,6邻域            sum_6 = a5+ a2 + a8 + a4 +a1 + a7            return 6*255 - sum_6    else:  # y不在边界        if x == 0:  # 左边非顶点            sum_7 = a4 + a5 + a6 + a7 + a8 + a9            return 6*255 - sum_7        elif x == width - 1:  # 右边非顶点            sum_8 = a4 + a5 + a6 + a1 + a2 + a3            return 6*255 - sum_8        else:  # 具备9领域条件的            sum_9 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9            return 9*255 - sum_9btn_Open = tk.Button(window,    text='打开图像',      # 显示在按钮上的文字    width=15, height=2,    command=get_im_path)     # 点击按钮式执行的命令btn_Open.pack()# 运行整体窗口window.mainloop()

到此,关于"python怎么实现分离图片和文字"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

图片 投影 顶点 像素 函数 水平 边界 邻域 阈值 文字 直方图 处理 均衡 区域 一行 中心点 原图 田字格 白色 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 做网络安全的专业有哪些 svn服务器搭建 mac carsim如何导入外来数据库 网络技术中ap是什么意思 苏州营销软件开发咨询热线 医疗器械系统软件开发及管理 网吧挂名的网络安全员 网络技术最牛的国家 无锡小程序软件开发平台 找有关商誉减值的数据库 成都计算机软件开发培训 随机访问服务器 服务器如何处理相同ip登录 斗鱼青少年网络安全研究中心 写一篇网络安全的博文英语作文 服务器升级管理员密码忘了 java 数据库实例讲解 奇瑞智能汽车网络安全链 阿里云海外节点服务器 海康cvr存储服务器硬盘未认证 唐山路北区轻回车软件开发 外国小孩组装惠普服务器视频 服务器延迟测试器 服务器raid10 学生网络安全知识竞赛总结 中国足协杯数据库 手游实况足球的服务器是什么 潞河中学网络安全培训专家 南京数字化智慧工地软件开发 安信证券网络技术部门
0