import cv2
import numpy as np
import warnings
warnings.filterwarnings('ignore')
def sort_contours(cnts, method="left-to-right"):
reverse = False
i = 0
if method == "right-to-left" or method == "bottom-to-top":
reverse = True
if method == "top-to-bottom" or method == "bottom-to-top":
i = 1
boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
key=lambda b: b[1][i], reverse=reverse))
return cnts, boundingBoxes
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
dim = None
(h, w) = image.shape[:2]
if width is None and height is None:
return image
if width is None:
r = height / float(h)
dim = (int(w * r), height)
else:
r = width / float(w)
dim = (width, int(h * r))
resized = cv2.resize(image, dim, interpolation=inter)
return resized
img=cv2.imread('number.png')
ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)
refCnts,_=cv2.findContours(ref,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# cv2.drawContours(img,refCnts,-1,(0,0,255),3)
refCnts = sort_contours(refCnts, method="left-to-right")[0]#排序,从左到右,从上到下
digits={}
for (i,c) in enumerate(refCnts):
(x,y,w,h)=cv2.boundingRect(c)
# cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
roi=ref[y:y+h,x:x+w]
roi=cv2.resize(roi,(57,88))
digits[i]=roi
# print(len(digits))
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
img=cv2.imread('testimage.png')
img=resize(img,width=300)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gradX=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
gradX=np.absolute(gradX)
minVal,maxVAL=np.min(gradX),np.max(gradX)
gradX=255*((gradX-minVal)/(maxVAL-minVal))
gradX=gradX.astype(np.uint8)
gradX=cv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel)
_,thres=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #只要灰度大于0的都设为255
thres=cv2.morphologyEx(thres,cv2.MORPH_CLOSE,sqKernel)
threshCnts,_=cv2.findContours(thres,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# cv2.drawContours(img,threshCnts,-1,(0,255,0),3)
cnts=threshCnts
locs=[]
for i,c in enumerate(cnts):
x,y,w,h=cv2.boundingRect(c)
if h>w:
h,w=w,h
acr=w/h
if 2.5