PIL利用投影分割图片数字(一)


import numpy as np 
from matplotlib import pyplot as plt 
from PIL import Image



def shuiping(image_data):
    """首先传递参数,读取的灰度图片;
    随后,将图片二值化;接着进行水平投影;
    利用水平投影的最后位置,确认出切割图片的坐标。
    """
    image=image_data
    limit = 200
    table = []

    #二值化,阈值200以下全部变为为0,其余变为1
    for i in range(256):
        if i < limit:
            table.append(0)
        else:
            table.append(1)
    image= image.point(table, '1')
    image= np.array(image)
    (h,w)=image.shape 
    a = [0 for z in range(0, h)]

    #水平投影,数组里的数字对应水平位置黑色区域像素点长度
    num =0 
    for j in range(0,h):  
        for i in range(0,w):
            if  image[j,i]==0:
                num+=1
                a[j]+=1 
                image[j,i]=255
    for j  in range(0,h):  
        for i in range(0,a[j]):   
            image[j,i]=0

    image=Image.fromarray(image)
    image.show()

    #水平投影最后会有结束点,结束点最后一个位置是黑色的,
    #对应数组不为0,白色位置对应数组位置全部为0
    x1=0
    y1=0
    y2=image.width
    x2=0
    for i in range(len(a)):
        if a[i]!=0 and a[i+1]==0:
            x2+=1
            break
        else:
            x2+=1
            
    
    croping = image_data.crop((x1,y1,y2,x2))
    croping.save( str("123") + '.jpg')
    print("分割完成,已保存!")
    return croping

def chuizhi(image_data):
    """首先传递参数,读取的灰度图片;
    随后,将图片二值化;接着进行垂直投影;
    利用垂直投影的间断特点,确认出切割图片的坐标。
    """
    image=image_data
    limit = 200
    table = []

    #二值化,阈值200以下全部变为为0,其余变为1
    for i in range(256):
        if i < limit:
            table.append(0)
        else:
            table.append(1)
    image= image.point(table, '1')
    image= np.array(image)
    
    (h,w)=image.shape
    print (h,w)

    #垂直投影,数组里的数字对应垂直位置黑色区域像素点长度
    b = [0 for z in range(0, w)] 
    num =0 
    for i in range(0,w):
        for j in range(0,h):
            if  image[j,i]==0:
                num+=1
                b[i]+=1 
                image[j,i]=255
    for i  in range(0,w):  
        for j in range(0,b[i]):   
            image[j,i]=0
    image=Image.fromarray(image)
    image.show()
    x1=0
    x2=0
    y1=h
    y2=0
    list=[]

    #垂直投影最后会有结束点,结束点最后一个位置是黑色的,
    #对应数组不为0,白色位置对应数组位置全部为0
    for i in range(len(b)):
        if b[i]==0 or b[i+1]!=0:
            y2+=1
        elif b[i]!=0 and b[i+1]==0:
            y2+=1
            list.append([x1,x2,(x1+y2),y1])
            x1=x1+y2
            y2=0 
    num=1
    for i in list:
        croping = image_data.crop(i)
        croping.save( "result/"+str(num) + '.jpg')
        num+=1
    print("分割完成,已保存!")


def main():
    img_path="num.jpg"
    image_data=(Image.open(img_path).convert('L'))
    pic=shuiping(image_data)
    chuizhi(pic)

main()

原始图片
在这里插入图片描述

水平投影
在这里插入图片描述

垂直投影
在这里插入图片描述

第一次切割:
在这里插入图片描述

第二次切割:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值