欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV图像变换(制作壁纸以及图像校正)

程序员文章站 2022-06-01 21:11:11
...

在大多数情况下,我们手中图片的分辨率与显示器的最佳分辨率不一致,这个时候将其设置为壁纸往往效果会有所降低,我们可以通过OpenCV中的cv.resize()函数来实现。

dst=cv2.resize(src,None,fx,fy,interpolation)#有两种调用方式,其一为直接给出目标图像的分辨率;其二是给出缩放比例,分辨率处为None,其中interpolation推荐在缩放时使用cv2.INTER_AREA,在扩展时采用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR(默认改变图像尺寸大小的插值方法)

img=cv2.imread('beautifulgirl.jpg')
#方法1,直接设置缩放因子,None位置应该输出图像的尺寸,后面放置了缩放比例,就不需要了
res1=cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA)
#方法2,输出尺寸,不需要缩放因子
height,width=img.shape[:2]
res2=cv2.resize(img,(1920,1080),interpolation=cv2.INTER_CUBIC)#注意尺寸元组为(宽度,高度)

图像的平移以及仿射均可以使用cv2.warpAffine来实现,其中的三个参数为src,变换矩阵以及输出分辨率,注意变换矩阵的创建均为np.float32数据类型,最后的透视变换则使用warpPerspective()来实现,这里做了一个校正的模型,可以来选择扭曲的点来完成,通过监听鼠标左键按下来选择变换的四个顶点。

实现的过程如下:

1. 读取图像,设置鼠标监听,监听鼠标左键按下的事件,记录四个点,记录满后,进行透视变换

cv2.namedWindow('image')
cv2.setMouseCallback('image',getPoints)
img=cv2.imread('number1.jpg')
row,col,_=img.shape
points=np.float32([[0,0],[0,0],[0,0],[0,0]])#变换的四个边界点信息

2. 定义getPoints函数

def getPoints(event,x,y,flags,param):
    global click_times,row,col,points
    if event==cv2.EVENT_LBUTTONDOWN:
        click_times+=1
        points[click_times-1]=[x,y]#将点击点的左边传给我们的points,用来变换的第一批参数
        cv2.circle(img,(x,y),4,(25,25,255),-1)#标记我们点击的位置信息
        cv2.rectangle(img,(col-60,row-20),(col,row),(255,255,255),-1)#空出一小块地方用来现实鼠标点击的位置
        cv2.putText(img,'%d,%d'%(x,y),(col-60,row-8),cv2.FONT_HERSHEY_SIMPLEX,0.4,(0,0,0),1)

3. 主循环函数,用来显示我们选择变换边界点的图像

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(10)& 0xFF==ord('q') or click_times>=4:#当按下q或者满4个点退出,进行变换
        break
cv2.destroyAllWindows()

4. 透视变换

pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])#输出图像的分辨率
M=cv2.getPerspectiveTransform(points,pts2)
dst=cv2.warpPerspective(img,M,(300,300))#透视变换

plt.subplot(121),plt.imshow(img,'gray'),plt.title('Input')
plt.subplot(122),plt.imshow(dst,'gray'),plt.title('Output')
plt.show()

效果:

OpenCV图像变换(制作壁纸以及图像校正)
图1 选择变换的边界点

选满四个点将退出该显示部分,实现图像的校正

OpenCV图像变换(制作壁纸以及图像校正)
图2 透视变换前后


参考文献 

openCV官方文档  for python


相关标签: transform openCV