问题描述:目录hw1下的图像是一些胶片的照片,请将其进行度量矫正。
采用Canny算子,检测边缘点,参数的设置不能太大也不能太小,这个很关键;
# 读取图像
image=r'./hw1/4.jpeg'
img = cv.imread(image)
# 灰度化处理图像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 高斯滤波降噪
gaussian = cv.GaussianBlur(grayImage, (11, 11), 0)
# Canny算子
Canny = cv.Canny(gaussian, 80, 120)
采用Hough直线检测,根据边缘点检测胶片边缘对应的4条直线,有时会有多余的直线存在,所以在计算交点时要进行筛选;
# hough_p:
lines_p = cv.HoughLinesP(Canny, rho = 10, theta = np.pi/180, threshold = 150, minLineLength= 250, maxLineGap=10)
for i in range(len(lines_p)):
x_1, y_1, x_2, y_2 = lines_p[i][0]
cv.line(img_p, (x_1, y_1), (x_2, y_2), (0, 255, 0), 2)
print("code successful!")
由4条直线在图像平面中的交点为胶片图像的4个 顶点;
for x1, y1, x2, y2 in lines[:]:
for x3,y3,x4,y4 in lines[:]:
point_is_exist, [x, y]=cross_point([x1, y1, x2, y2],[x3,y3,x4,y4])
if point_is_exist and (int(y) > 150) and (int(x) < 3000): #剔除多余点!
list_image.append((int(x),int(y)))
cv.circle(img_p2,(int(x),int(y)),5,(0,0,255),3)
根据4个 顶点与真实世界中胶片的位置得到两个平面之间的单应变换矩阵;并根据单应变换矩阵实现图像矫正
dst_point = np.array([[dsize[0]-1,0],[0,0],[0,dsize[1]-1],[dsize[0]-1,dsize[1]-1]])
h, s = cv.findHomography(src_point, dst_point, cv.RANSAC, 10)
img = cv.warpPerspective(img_p2, h, dsize)
img = cv.cvtColor(img, cv.COLOR_RGB2BGR)
注:由于每张图都不一样,canny的参数以及Hough直线检测的参数会有一定程度影响实验结果,为了得到更好的实验结果分别对每张图片进行了调参。
问题描述:目录hw2下有两幅学校的照片,请根据课程中讲述图像拼接方法,将这两幅图像拼接成一幅大的图像。
1.对每幅图做特征提取,根据提取到的特征点对两幅图做特征匹配。
2.图像配准及误匹配点的去除,即根据匹配的特征点找出重叠部分的对应坐标,并求出对应坐标转换的矩阵homography。
3.根据转换矩阵将右图拷贝到左图的指定位置上。
4.对重叠的边界做特殊处理,如平滑处理、去裂缝处理、过渡等。
问题描述:目录hw3下有立体视觉对应的两幅图像view1.png和view5.png,图像来源于http://vision.middlebury.edu/stereo/data/。请计算出这两幅图像对应场景的深度。。
极线校正:校正的目的是使两帧图像极线处于水平方向,或者说是使两帧图像的光心处于同一水平线上。
特征匹配:这里便是我们利用NCC做匹配的步骤啦,匹配方法如上所述,右视图中与左视图待测像素同一水平线上相关性最高的即为最优匹配。完成匹配后,我们需要记录其视差d,即待测像素水平方向xl与匹配像素水平方向xr之间的差值d = xr - xl,最终我们可以得到一个与原始图像尺寸相同的视差图D。
深度恢复:通过上述匹配结果得到的视差图D,我们可以很简单的利用相似三角形反推出以左视图为参考系的深度图。