为了降低成本和体积,一些光电产品在设计时常采用计算替代复杂的光学修正。现有一指采集设备,有效窗口尺寸为32mm X 32mm,直接获取带有窗口的图像。请对图像进行修正,得到640X640无畸变的指纹图像。
基本思路:
代码如下:
import cv2
import numpy as np
import time
#read image
inimage=cv2.imread("D:\python_opencv_src\images\_finger.jpg",1)
cv2.imshow("finger",inimage)
#allocating image space color ROI [ymin:ymax, xmin:xmax]
ROIimg = inimage[0:342,16:671] #原图中所选取ROI的范围
cv2.imwrite("ROI.jpg",ROIimg)
col,row,ch = ROIimg.shape
print (col,row,ch)
#set the source point in source image
inpoints=np.float32([(0,0),(655,0),(39,342),(630,341)])#p1,p2,p3,p4,即ROI中需处理的畸变区域顶点(本实验中为指纹所在的显示屏四角)的坐标
outpoints=np.float32([(0,0),(639,0),(0,639),(639,639)])#p'1,p'2,p'3, p'4,即输出图像目标顶点坐标,与输出图像尺寸关联
#get Transform parameters
Trans=cv2.getPerspectiveTransform(np.array(inpoints),np.array(outpoints))
#Transform
start = time.clock()
transimg=cv2.warpPerspective(ROIimg,Trans,(640,640)) # 输出图像640x640
end = time.clock()
print("time=",end-start)
#cv2.imshow('ROI',ROIimg)
#cv2.imwrite("cinema_out.jpg",transimg)
cv2.imshow('output',transimg)
while 1:
key = cv2.waitKey(1)
if key>0:
break
cv2.destroyAllWindows()
查看图片中某点坐标的方法参考:快速查看图片中某点的像素 X、Y 坐标_图片坐标_L -GRAZY的博客-CSDN博客
效果如下:
原图:
修复后:
可以看出,畸变的指纹得到了修正