今天想要构建自己的MNIST数据集,但是一个一个手画然后拍照再把数字一个一个抠出来实在是太耗时了,所以想用程序解决这个问题:
下面附上程序:(备注:里面的代码是在之前某个博主的代码基础上改装过来的,具体是哪个我已经不记得了)
import cv2
import numpy as np
import matplotlib.pyplot as plt
def accessPiexl(img):
height = img.shape[0]
width = img.shape[1]
for i in range(height):
for j in range(width):
img[i][j] = 255 - img[i][j]
return img
def accessBinary(img, threshold=200):
img = accessPiexl(img)
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
_, img = cv2.threshold(img, threshold, 0, cv2.THRESH_TOZERO)
return img
def findBorderContours(path, maxArea=50):
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = accessBinary(img)
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
borders = []
border_sortt = []
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if w*h > maxArea:
border = [(x, y), (x+w, y+h)]
borders.append(border)
return borders
def Save_Results(path, borders):
img = cv2.imread(path)
print(img.shape)
for i, border in enumerate(borders):
print("border = ",border)
pic = img[border[0][1] - 30 :border[1][1] + 30 , border[0][0] - 30 : border[1][0] + 30]
cv2.imwrite("D:/0000{num}.jpg".format(num=i),pic)
if __name__ == '__main__':
path = './1.jpg'
borders = findBorderContours(path)
Aave_Results(path, borders)
显示效果:
原图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c96c51d59e04e088331e386e4d2d741.png)
处理后的:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe5475f9a55b4b9fa639c527c3468332.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/63e38e9fb1cf43c7aa8fb41a9e209259.png)
处理的结果勉勉强强,勿喷
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)