def gera_imagens_deformadas(self): imagemSource = imread(self.nomeImagem + ".jpg") alturaImagem, larguraImagem, _ = shape(imagemSource) imagemDeformada = imagemSource.copy() for linhaPixel in range(0, alturaImagem): print "Imagem: "+ self.nomeImagem + ", interpolacao: " + str(self.passo) + " Linha: " + str(linhaPixel) for colunaPixel in range(0, larguraImagem): X = Point(linhaPixel, colunaPixel) DSUM = Point(0,0) weightsum = 0 for linhaAtualInterpolada in self.linhasInterpoladas: indice = self.linhasInterpoladas.index(linhaAtualInterpolada) linhaEquivalenteEmSemelhante1 = self.linhasImagemASerDeformada[indice] U = self.calculateU(X, linhaAtualInterpolada.ponto_inicial, linhaAtualInterpolada.ponto_final) V = self.calculateV(linhaAtualInterpolada, X) Xi = self.calculateXlinha(U, V, linhaEquivalenteEmSemelhante1) Di = Xi - X if U > 0 and U < 1: dist = abs(V) elif U < 0: dist = X.distancia(linhaAtualInterpolada.ponto_inicial) else: dist = X.distancia(linhaAtualInterpolada.ponto_final) weight = ( 1 / (0.001 + dist) )**2 DSUM = DSUM + (Di * weight) weightsum = weightsum + weight Xlinha = X + DSUM/weightsum # para evitar inconsistencias e pegar valores inexistentes if Xlinha.x >= 288: Xlinha.x = 287 elif Xlinha.x < 0: Xlinha.x = 0 if Xlinha.y >= 384: Xlinha.y = 383 elif Xlinha.y < 0: Xlinha.y = 0 imagemDeformada[X.x, X.y] = imagemSource[int(math.trunc(Xlinha.x)), int(math.trunc(Xlinha.y))] nomeImagem = "imagens_" + self.nomeImagem + "/deformacao_passo"+ str(self.passo) + ".jpg" imsave(nomeImagem, imagemDeformada) self.cancelled = True
#Linhas da imagem for i in range(alturaImagem): print "Calculando linha",i,"no passo",passo #Colunas da imagem for j in range(larguraImagem): X = Point(i,j) distFinal = float("inf") for numLinha,linhaDeInteresse in enumerate(linhasInterpoladas): U = calculateU(X, linhaDeInteresse.ponto_inicial, linhaDeInteresse.ponto_final) V = calculateV(linhaDeInteresse, X) if U > 0 and U < 1: dist = abs(V) elif U < 0: dist = X.distancia(linhaDeInteresse.ponto_inicial) else: dist = X.distancia(linhaDeInteresse.ponto_final) if dist < distFinal: Ufinal = U Vfinal = V distFinal = dist numLinhaFinal = numLinha Xlinha = pixel(Ufinal,Vfinal,conjuntoLinhasInterpoladas[0][numLinhaFinal],imagemSrc) X2linha = pixel(Ufinal,Vfinal,conjuntoLinhasInterpoladas[numeroImagensIntermediarias+1][numLinhaFinal],imagemDest) t = float(passo)/numeroImagensIntermediarias imagemDeformada[i,j] = [(1-t)*Xlinha[k] + t*X2linha[k] for k in range(3)] # imagensIntermediarias[passo] = imagemDeformada