#############################################################################################
############################圖片預處理以及圖片裁剪###########################################
#############################################################################################
######圖片切割##########
import os
import os.path
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
import time
#########################切割函數#########################################
#################我的是根據目標圖片,80*20以及實驗得出結論################
##########################################################################
def segment(im):
s=6 #首次第一個點的橫坐標
w=16 #寬度
h=20 #第二個點的縱坐標
t=0 #第一個點的縱坐標
im_new=[]#在一張圖片裁剪四個區域
#for i in range(4):
# im1=im.crop((s+w*i,t,s+w*(i+1),h)) #crop函數得到局部區域
# im_new.append(im1)
im1=im.crop((6,0,6+17,20))
im_new.append(im1)
im1=im.crop((23,0,23+16,20))
im_new.append(im1)
im1=im.crop((39,0,39+16,20))
im_new.append(im1)
im1=im.crop((55,0,55+18,20))
im_new.append(im1)
return im_new
#################圖片增強######################################
#################圖片二值化函數:符合閾值之上,設為1;否則設為0###
###############################################################
def binarizing(im,threshold):
pixdata=im.load()
w,h=im.size
for j in range(h):
for i in range(w):
if pixdata[i,j]<threshold:
pixdata[i,j]=0
else:
pixdata[i,j]=255
return im
################################圖片去噪############################
##########對於像素值>245的鄰域像素,判別為屬於背景色################
##########,如果一個像素上下左右4各像素值有超過2個##################
##########像素屬於背景色,那么該像素就是目標點,否則就是噪聲##########
####################################################################
def denoising(im):
pixdata=im.load()
w,h=im.size
for j in range(1,h-1):
for i in range(1,w-1):
count=0
if pixdata[i,j-1]>245:
count=count+1
if pixdata[i,j+1]>245:
count=count+1
if pixdata[i+1,j]>245:
count=count+1
if pixdata[i-1,j]>245:
count=count+1
if count>2:
pixdata[i,j]=255
return im
###############################################################################
##############圖片轉換:打開圖片,濾波器,增強,灰度圖轉換,去噪,二值化############
###############################################################################
def imgTransfer(f_name):
im=Image.open(f_name) #打開圖片
im=im.filter(ImageFilter.MedianFilter(1)) #對於輸入圖像的每個像素點,該濾波器從(size,size)的區域中拷貝中值對應的像素值存儲到輸出圖像中
#enhancer=ImageEnhance.Contrast(im)
#im=enhancer.enhance(1)
im=ImageEnhance.Contrast(im).enhance(1.5)#enhance()的參數factor決定着圖像的對比度情況。從0.1到0.5,再到0.8,2.0,圖像的對比度依次增大.0.0為純灰色圖像;1.0為保持原始
im=im.convert('L') #灰度圖轉換
im=denoising(im) #圖片去噪
im=binarizing(im,200) #圖片二值化
#im=nse.removeNoisy(im)
#im.save('/User/iswin/Downloads/vim/test.clear.jpg','jpeg')
#im.show()
return im
#####批量裁剪圖片,並保存######################################
def cutPictures(img):
im=imgTransfer(img)#####圖片預處理,二值化,圖片增強
pics=segment(im) #######用crop函數裁剪
for pic in pics:
pic.save('G:\Test\%s.jpg'%(int(time.time()*1000000)),'jpeg')
rootdir=u'G:\Test'
for parent,dirnames,filenames in os.walk(rootdir):
for dirname in dirnames:
print "dirname is:"+dirname
print "parent is:"+parent
for filename in filenames:
print "filename is:"+filename
print "parent is:"+parent
print "the full name is:"+os.path.join(parent,filename)
cutPictures(os.path.join(parent,filename))
########實驗效果如下: