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()
原始图片
水平投影
垂直投影
第一次切割:
第二次切割: