import cv2 import numpy as np import random import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread("img2.png",0) rows,cols=img.shape pts1 = np.float32([[0,0],[0,100],[100,100],[100,0]]) pts2 = np.float32([[0,0],[0, 99],[101,101],[100,0]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()
warpPerspective.py
重ね合わせてみると。。
ずれているのがわかります。同様のことを百枚分処理して重ね合わせてみます。
import cv2 import numpy as np import random import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread("img2.png",0) rows,cols=img.shape sumimg = img/255.0 for i in range(100): var=20 pts1 = np.float32([[0,0],[0,rows],[cols,rows],[cols,0]]) pts2 = np.float32([[random.randint(-var,var),random.randint(-var,var)], [random.randint(-var,var), rows+random.randint(-var,var)], [cols+random.randint(-var,var),rows+random.randint(-var,var)], [cols+random.randint(-var,var),random.randint(-var,var)]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(cols,rows)) sumimg+=dst/255.0 plt.imshow(sumimg) plt.colorbar() plt.show()
100.py
var=20となっているところをvar=40とすると、ブレが大きくなります。
画像を分割し、それぞれで異なる変換行列で変換を行う
このような画像全体を不規則に歪める処理を実装してみます。
import cv2 import numpy as np import random import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread("img2.png",0) def transform(img): N=12 S=16 originalSize = img.shape img = cv2.resize(img,(S*N+1,S*N+1)) rows,cols=(S*N+1,S*N+1) points=[] #N*Nのグリッドを作成 for i in range(0,rows,S): tmp=[] for j in range(0,cols,S): tmp.append([i,j]) points.append(tmp) points_t=[] #10*10のグリッドを作成 for i in range(0,rows,S): tmp=[] for j in range(0,cols,S): n=6 tmp.append([i+random.uniform(-S//n,S//n),j+random.uniform(-S//n,S//n)]) points_t.append(tmp) t = img*0 for i in range(N): for j in range(N): pts1 = np.float32([points[i][j],points[i+1][j],points[i+1][j+1],points[i][j+1]]) pts2 = np.float32([points_t[i][j],points_t[i+1][j],points_t[i+1][j+1],points_t[i][j+1]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(cols,rows)) pts1_ = np.int32(pts1).reshape((-1,1,2)) pts2_ = np.int32(pts2).reshape((-1,1,2)) mask = dst*0 cv2.fillPoly(mask,[pts2_],1) t = cv2.bitwise_or(t,dst*mask) t = cv2.resize(t,originalSize) return t t=transform(img) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(t),plt.title('Output') plt.show()
transform.py
5枚まとめて処理して重ね合わせてみます。