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()
效果:
图1 选择变换的边界点
选满四个点将退出该显示部分,实现图像的校正
图2 透视变换前后
参考文献
openCV官方文档 for python