美术作画中有透视的概念,近大远小,意思是里自己近的地方,视觉上给人的感觉很大,而离自己远的地方,视觉上给人感觉很小.

图片也会有这个特性,不过在计算机设计做一些判断的时候,我们希望去掉透视效果,这样处理图片会变得容易些,这时我们可以使用透视变换函数.

我们先要获得透视变换前后的映射关系,在原图上找到4个点,然后在指定透视变换后4个点的位置,通过cv2.getPerspectiveTransform()函数可以建立的映射关系.

import matplotlib.pyplot as plt
import numpy as np
import cv2

img = plt.imread('./road-3133502_640.jpg')
src = np.float32([
    [0, 400],
    [640, 400],
    [300, 260],
    [350, 260],
])
dst = np.float32([
    [200, 426],
    [400, 426],
    [200, 0],
    [400, 0],
])

M = cv2.getPerspectiveTransform(src, dst)

图片中蓝点是映射前的点,红点是指定的映射后的点

随后我们使用cv2.warpPerspective()函数,对图片进行透视变换.

warped = cv2.warpPerspective(img, M, (img.shape[1],img.shape[0]), flags=cv2.INTER_NEAREST)
f,(ax1,ax2) = plt.subplots(1,2)
ax1.imshow(img)
ax1.scatter(src[:,:1],src[:,1:2],color='b')
ax1.scatter(dst[:,:1],dst[:,1:2],color='r')
ax2.imshow(warped)
plt.show()

看!路被我们”拉直”了

posted @ 2018-05-17 11:19:21
评论加载中...

发表评论