你推薦分段這個圖像中的字符準備餵養一個像MNIST數據集一樣使用的模型;因爲他們一次只帶一個角色。這個問題無論是改變圖像及其二值化的重要性都是無與倫比的。Python:圖像分割作爲分類的預處理
謝謝!
你推薦分段這個圖像中的字符準備餵養一個像MNIST數據集一樣使用的模型;因爲他們一次只帶一個角色。這個問題無論是改變圖像及其二值化的重要性都是無與倫比的。Python:圖像分割作爲分類的預處理
謝謝!
作爲一個起點,我會嘗試以下方法:
以下是前4個階段。現在您需要添加識別軟件來識別數字。
import cv2
import numpy as np
from matplotlib import pyplot as plt
# Params
EPSSILON = 0.4
MIN_AREA = 10
BIG_AREA = 75
# Read img
img = cv2.imread('i.jpg',0)
# Otzu threshold
a,thI = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# Morpholgical
se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(1,1))
thIMor = cv2.morphologyEx(thI,cv2.MORPH_CLOSE,se)
# Connected compoent labling
stats = cv2.connectedComponentsWithStats(thIMor,connectivity=8)
num_labels = stats[0]
labels = stats[1]
labelStats = stats[2]
# We expect the conneccted compoennt of the numbers to be more or less with a constats ratio
# So we find the medina ratio of all the comeonets because the majorty of connected compoent are numbers
ratios = []
for label in range(num_labels):
connectedCompoentWidth = labelStats[label,cv2.CC_STAT_WIDTH]
connectedCompoentHeight = labelStats[label, cv2.CC_STAT_HEIGHT]
ratios.append(float(connectedCompoentWidth)/float(connectedCompoentHeight))
# Find median ratio
medianRatio = np.median(np.asarray(ratios))
# Go over all the connected component again and filter out compoennt that are far from the ratio
filterdI = np.zeros_like(thIMor)
filterdI[labels!=0] = 255
for label in range(num_labels):
# Ignore biggest label
if(label==1):
filterdI[labels == label] = 0
continue
connectedCompoentWidth = labelStats[label,cv2.CC_STAT_WIDTH]
connectedCompoentHeight = labelStats[label, cv2.CC_STAT_HEIGHT]
ratio = float(connectedCompoentWidth)/float(connectedCompoentHeight)
if ratio > medianRatio + EPSSILON or ratio < medianRatio - EPSSILON:
filterdI[labels==label] = 0
# Filter small or large compoennt
if labelStats[label,cv2.CC_STAT_AREA] < MIN_AREA or labelStats[label,cv2.CC_STAT_AREA] > BIG_AREA:
filterdI[labels == label] = 0
plt.imshow(filterdI)
# Now go over each of the left compoenet and run the number recognotion
stats = cv2.connectedComponentsWithStats(filterdI,connectivity=8)
num_labels = stats[0]
labels = stats[1]
labelStats = stats[2]
for label in range(num_labels):
# Crop the bounding box around the component
left = labelStats[label,cv2.CC_STAT_LEFT]
top = labelStats[label, cv2.CC_STAT_TOP]
width = labelStats[label, cv2.CC_STAT_WIDTH]
height = labelStats[label, cv2.CC_STAT_HEIGHT]
candidateDigit = labels[top:top+height,left:left+width]
# plt.figure(label)
# plt.imshow(candidateDigit)
我連接到Amitay答案。
爲2: 我會用細化的形態操作(看thinning algorithm in opencv)
對於3: 而在OpenCV的3.0已經有一個叫做cv::connectedComponents)功能
希望它可以幫助
謝謝。你在Python中有相同的文檔嗎? – donpresente
對於OpenCV,通常功能與C++的功能完全相同,因此cv2.connectedComponents應該完成這項工作。 –
至於細化算法我沒有對Python代碼的引用,但是如果你閱讀它很容易在python中進行轉置,我相信你將沒有困難,它只是再次使用對應的opencv函數在python中。 –
2和3的任何想法?請多一點信息? – donpresente
for 2請看http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html –
查看http://docs.opencv.org/2.4/doc/tutorials/imgproc /shapedescriptors/find_contours/find_contours.html –