手寫數字識別,要求28*28像素,白字黑底
一開始使用了SciPy來轉換
出現 AttributeError: module 'scipy' has no attribute 'misc' 報錯,應該是版本問題,修改無果,採用了更簡單的OpenCV
import cv2
image = cv2.imread("8.jpg")
image2 = cv2.resize(image, (28, 28))
gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY)
for i in range(28):
for j in range(28):
binary[i, j] = 255 - binary[i, j]
# cv2.imshow("binary", binary)
# cv2.waitKey(0)
cv2.imwrite("8_binary.jpg", binary)
進行尺寸修改,灰度化,二值化
然後遍歷每個像素,255 - 像素值實現反相
優化
後來經提醒,將遍歷改爲 ~ 運算:按位取反運算符
binary = ~binary
~的定義:對數據的每個二進制位取反,即把1變爲0,把0變爲1 。~x 類似於 -x-1
但是 255 應該變爲 -256了,而非0
後來經過試驗,發現圖片中的數字爲 numpy.uint8 格式,對於uint8 ,~ 爲 255-x
>>> d = np.uint8(5)
>>> d
5