diff --git a/customPatchMatch.py b/customPatchMatch.py index cf4a5d1..3ebfd91 100644 --- a/customPatchMatch.py +++ b/customPatchMatch.py @@ -4,25 +4,95 @@ import numpy as np -def doPatchMatch(img,x1,y1,x2,y2,patchSize=20): +def doPatchMatch(img,x1,y1,x2,y2,patchSize=17): + + def dist(patchValue1,patchValue2): + return np.sum((patchValue1 - patchValue2) ** 2) + + def patchToValue(patch): + return img[patch[0][1]:patch[len(patch)-1][1], patch[0][0]:patch[len(patch)-1][0]] def getRandomPatch(): rx = np.random.randint(0, width - patchSize) ry = np.random.randint(0, height - patchSize) return rx, ry + def initializePermimiter(): + perimeter = [] + for x in range(x1, x2 + 1): + perimeter.append((x, y1)) + perimeter.append((x, y2)) + + for y in range(y1 + 1, y2): + perimeter.append((x1, y)) + perimeter.append((x2, y)) + img[y1:y2+1, x1:x2+1] = -1 + return np.array(perimeter) + + def removeAndAddFromPerimiter(perimiter, addr): + p= [] + npAddr = np.array(addr) + for coord in perimiter: + if not np.any(np.all(npAddr == np.array(coord), axis=1)): + p.append(coord) + + perimiter = p + p1 = patchSize+2 + for dx in range(-1, p1): + for dy in range(-1, p1): + if (dx!=-1 and dx!=p1-1 and dy != -1 and dy != p1-1): + continue + nx, ny = addr[0,0] + dx, addr[0,1] + dy + if 0 <= nx < width and 0 <= ny < height and img[ny, nx][0] == -1: + if len(perimiter) == 0: + perimiter.append([nx, ny]) + continue + if not np.any(np.all(perimiter == np.array([int(nx), int(ny)]), axis=1)): + perimiter.append([nx, ny]) + return perimiter + def applyPatch(patch,addr): + for i in range(len(addr)): + if img[addr[i, 1], addr[i, 0]][0] == -1: + img[addr[i, 1], addr[i, 0]] = img[patch[i, 1],patch[i, 0]] + + def getRandomFromPerimiter(perimiter): + return perimiter[np.random.randint(len(perimiter))] + + def loop(perimiter): + x,y = getRandomFromPerimiter(perimiter) + addr = np.array([[i, j] for i in range(patchSize) for j in range(patchSize)]) - semiPatch + addr[:,0] = addr[:,0] + x + addr[:,1] = addr[:,1] + y + ogValue = patchToValue(addr) + px,py = getRandomPatch() + patch = np.array([[i, j] for i in range(patchSize) for j in range(patchSize)]) + patch[:,0] = patch[:,0] + px + patch[:,1] = patch[:,1] + py + patchValue = patchToValue(patch) + applyPatch(patch,addr) + perimiter = removeAndAddFromPerimiter(perimiter,addr) + return perimiter + + + + semiPatch = int(patchSize/2) height, width, _ = img.shape - xx1 = max(0, x1-semiPatch) - yy1 = max(0, y1-semiPatch) - xx2 = min(width, x2+semiPatch) - yy2 = min(height, y2+semiPatch) - if (xx2-xx1 < patchSize or yy2-yy1 < patchSize): - return img - + perimiter = initializePermimiter() + it = 0 + # perimiter = loop(perimiter) + # for coord in perimiter: + # img[coord[1], coord[0]] = [1,1,1,1] + # img[img == -1] = 0 + while len(perimiter)> 0: + it += 1 + perimiter = loop(perimiter) + if (it == 1000): + it = 0 + print(len(perimiter)) return img @@ -45,8 +115,8 @@ def onselect(eclick, erelease): print("drawing") img_copy = np.copy(img) - #res = doKnn(img_copy,int(x1),int(y1),int(x2),int(y2)) - ax.imshow(img_copy) + res = doPatchMatch(img_copy,int(x1),int(y1),int(x2),int(y2)) + ax.imshow(res) plt.draw() print("drawed")