diff --git a/src/image_analyzer.py b/src/image_analyzer.py --- a/src/image_analyzer.py +++ b/src/image_analyzer.py @@ -2,47 +2,47 @@ class ImageAnalyzer: - - def __init__(self): - self.board=[[Go.EMPTY]*19 for r in range(19)] - self.grid=None - - def analyze(self,image,tresB,tresW,sizeCoef,shift): - if self.grid==None: return False - - for r in range(19): - for c in range(19): - intersection=self.grid.intersections[r][c] - - self.board[r][c]=self.analyzePoint(image,intersection*sizeCoef+shift,*(self.grid.stoneSizeAt(r,c,sizeCoef)),tresB,tresW) - - def analyzePoint(self,image,imageCoords,stoneWidth,stoneHeight,tresB,tresW): - b=w=e=0 + + def __init__(self): + self.board=[[Go.EMPTY]*19 for r in range(19)] + self.grid=None + + def analyze(self,image,tresB,tresW,sizeCoef,shift): + if self.grid==None: return False - ((x1,y1),(x2,y2))=self.relevantRect(imageCoords,stoneWidth,stoneHeight) + for r in range(19): + for c in range(19): + intersection=self.grid.intersections[r][c] + + self.board[r][c]=self.analyzePoint(image,intersection*sizeCoef+shift,*(self.grid.stoneSizeAt(r,c,sizeCoef)),tresB,tresW) + + def analyzePoint(self,image,imageCoords,stoneWidth,stoneHeight,tresB,tresW): + b=w=e=0 + + ((x1,y1),(x2,y2))=self.relevantRect(imageCoords,stoneWidth,stoneHeight) - for y in range(y1,y2+1): - for x in range(x1,x2+1): - red,green,blue=image.getpixel((x,y)) - - I=(red+green+blue)/255/3 - m=min(red,green,blue) - S=1-m/I - if 100*ItresW: w+=1 - else: e+=1 - - if b>=w and b>=e: return Go.BLACK - if w>=b and w>=e: return Go.WHITE - return Go.EMPTY + for y in range(y1,y2+1): + for x in range(x1,x2+1): + red,green,blue=image.getpixel((x,y)) + + I=(red+green+blue)/255/3 + m=min(red,green,blue) + S=1-m/I + if 100*ItresW: w+=1 + else: e+=1 - def relevantRect(self,imageCoords,stoneWidth,stoneHeight): - x=int(imageCoords.x) - y=int(imageCoords.y) - xmax=max(int(stoneWidth*2//7), 2) # !! optimal parameters subject to further research - ymax=max(int(stoneHeight*2//7), 2) + if b>=w and b>=e: return Go.BLACK + if w>=b and w>=e: return Go.WHITE + return Go.EMPTY - return ((x-xmax,y-ymax), (x+xmax,y+ymax)) - - def setGrid(self,grid): - self.grid=grid + def relevantRect(self,imageCoords,stoneWidth,stoneHeight): + x=int(imageCoords.x) + y=int(imageCoords.y) + xmax=max(int(stoneWidth*2//7), 2) # !! optimal parameters subject to further research + ymax=max(int(stoneHeight*2//7), 2) + + return ((x-xmax,y-ymax), (x+xmax,y+ymax)) + + def setGrid(self,grid): + self.grid=grid