python - 裁剪手写数字图像
python - Cropping an image of handwritten digit
我正在尝试使用 MNIST 作为数据集来预测手写数字 & python。现在,我必须将已经裁剪过的图像作为程序的输入。
进一步处理以使其成为 MNIST 数据集格式是使用以下函数完成的,但是如何自动裁剪作为输入给定的随机图像?
def imageprepare(argv):
"""
This function returns the pixel values.
The imput is a png file location.
"""
im = Image.open(argv).convert('L')
width = float(im.size[0])
height = float(im.size[1])
newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixels
if width > height: #check which dimension is bigger
#Width is bigger. Width becomes 20 pixels.
nheight = int(round((20.0/width*height),0)) #resize height according to ratio width
if (nheigth == 0): #rare case but minimum is 1 pixel
nheigth = 1
# resize and sharpen
img = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozition
newImage.paste(img, (4, wtop)) #paste resized image on white canvas
else:
#Height is bigger. Heigth becomes 20 pixels.
nwidth = int(round((20.0/height*width),0)) #resize width according to ratio height
if (nwidth == 0): #rare case but minimum is 1 pixel
nwidth = 1
# resize and sharpen
img = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozition
newImage.paste(img, (wleft, 4)) #paste resized image on white canvas
#newImage.save("sample.png")
tv = list(newImage.getdata()) #get pixel values
#normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
tva = [ (255-x)*1.0/255.0 for x in tv]
return tva
您可以使用 OpenCV 轮廓在您的实际图像中定位潜在数字,一些技术将取决于您使用的实际数据。在 http://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/ 有一个数字候选位置的例子
可以给你一些指点。
但是,您可能会遇到某些脚本的问题,因为我认为虽然在所有欧洲脚本中每个数字都应该是连续且不同的,但我不确定这两点是否适用于所有脚本。
我正在尝试使用 MNIST 作为数据集来预测手写数字 & python。现在,我必须将已经裁剪过的图像作为程序的输入。 进一步处理以使其成为 MNIST 数据集格式是使用以下函数完成的,但是如何自动裁剪作为输入给定的随机图像?
def imageprepare(argv):
"""
This function returns the pixel values.
The imput is a png file location.
"""
im = Image.open(argv).convert('L')
width = float(im.size[0])
height = float(im.size[1])
newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixels
if width > height: #check which dimension is bigger
#Width is bigger. Width becomes 20 pixels.
nheight = int(round((20.0/width*height),0)) #resize height according to ratio width
if (nheigth == 0): #rare case but minimum is 1 pixel
nheigth = 1
# resize and sharpen
img = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozition
newImage.paste(img, (4, wtop)) #paste resized image on white canvas
else:
#Height is bigger. Heigth becomes 20 pixels.
nwidth = int(round((20.0/height*width),0)) #resize width according to ratio height
if (nwidth == 0): #rare case but minimum is 1 pixel
nwidth = 1
# resize and sharpen
img = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozition
newImage.paste(img, (wleft, 4)) #paste resized image on white canvas
#newImage.save("sample.png")
tv = list(newImage.getdata()) #get pixel values
#normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
tva = [ (255-x)*1.0/255.0 for x in tv]
return tva
您可以使用 OpenCV 轮廓在您的实际图像中定位潜在数字,一些技术将取决于您使用的实际数据。在 http://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/ 有一个数字候选位置的例子 可以给你一些指点。
但是,您可能会遇到某些脚本的问题,因为我认为虽然在所有欧洲脚本中每个数字都应该是连续且不同的,但我不确定这两点是否适用于所有脚本。