计算机视觉 实验三 特征检测
- 一、实验目的
- 二、实验内容、代码及结果
-
- 1、获取实验用图像:EyeImage.png,使用cv2.imread()函数将图像读入, 利用cv2. filter2D()函数编写程序实现实验三实验指导书第3页中的3个拉普拉斯算子变形模板的边缘检测,输出处理后的图像,并进行对比分析。
- 2、获取实验用图像:rice.jpg,使用cv2.imread()函数将图像读入,利用numpy分别实现基于Priwitt算子的边缘检测,输出处理后的图像。
- 3、对实验用图像rice.jpg,分别计算其基于Laplacian算子和Canny算子的边缘检测,输出处理后的图像,并进行对比分析。
- 4、将chess.jpg图像文件读入,利用cv2.cornerHarris() 可以用来进行角点检测,要求在原图上绘制出检测出的角点。
- 5、读入一组图像:01.jpg和02.jpg, 利用OpenCV提供的SIFT算子检测其特征点及其描述子,要求绘制的特征点是一个个带有方向的圆。
- 三、实验用图片下载
一、实验目的
1.图像的边缘检测;
2.Harris角点检测;
3.SIFT特征点检测与描述子
实验仪器
Python+OpenCV
二、实验内容、代码及结果
1、获取实验用图像:EyeImage.png,使用cv2.imread()函数将图像读入, 利用cv2. filter2D()函数编写程序实现实验三实验指导书第3页中的3个拉普拉斯算子变形模板的边缘检测,输出处理后的图像,并进行对比分析。
import cv2
import numpy as np
from matplotlib import pyplot as plt
src = cv2.imread("Imgs4EXP3/EyeImage.png")
if src is None:
print("the file is not loaded")
else:
#修改这个kernal,得到不同的Laplacian算子
kernel1 = np.array((
[0, 1, 0],
[1, -4, 1],
[0, 1, 0]), dtype="float32")
print(kernel1)
#线性滤波的 cv.filter2D,filter2D() 这个函数的主要功能是通过卷积核实现对图像的卷积运算:
dst = cv2.filter2D(src, -1, kernel1)
#np.hstack将参数元组的元素数组按水平方向进行叠加
htich = np.hstack((src, dst))
plt.imshow(htich)
plt.title('1 Original image & processed image')
plt.show()
#修改这个kernal,得到不同的Laplacian算子
kernel2 = np.array((
[0, 1, 1],
[-1, 0, 1],
[-1, -1, 0]), dtype="float32")
dst = cv2.filter2D(src, -1, kernel2)
htich = np.hstack((src, dst))
plt.imshow(htich)
plt.title('2 Original image & processed image')
plt.show()
#修改这个kernal,得到不同的Laplacian算子
kernel3 = np.array((
[-1, -2, -1],
[-2, 12, -2],
[-1, -2, -1]), dtype="float32")
dst = cv2.filter2D(src, -1, kernel3)
htich = np.hstack((src, dst))
plt.imshow(htich)
plt.title('3 Original image & processed image')
plt.show()
3个拉普拉斯算子变形模板的边缘检测,随着第二行第二列数值的增大,处理后的图像检测边缘越来越明显。
2、获取实验用图像:rice.jpg,使用cv2.imread()函数将图像读入,利用numpy分别实现基于Priwitt算子的边缘检测,输出处理后的图像。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread('Imgs4EXP3/rice.jpg', cv.COLOR_BGR2GRAY)
rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 灰度化处理图像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# Prewitt 算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x = cv.filter2D(grayImage, cv.CV_16S, kernelx)
y = cv.filter2D(grayImage, cv.CV_16S, kernely)
# 转 uint8 ,图像融合
absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)
#addWeighted()函数:用来将两个图片进行融合。
Prewitt = cv.addWeighted(absX, 0.5, absY, 0.5, 0)
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示图形
titles = ['原始图像', 'Prewitt 算子']
images = [rgb_img, Prewitt]
for i in range(2):
plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
3、对实验用图像rice.jpg,分别计算其基于Laplacian算子和Canny算子的边缘检测,输出处理后的图像,并进行对比分析。
#基于Laplacian算子
import cv2
import numpy as np
from matplotlib import pyplot as plt
src = cv2.imread("Imgs4EXP3/rice.jpg")
if src is None:
print("the file is not loaded")
else:
kernel = np.array((
[-1, -2, -1],
[-2, 12, -2],
[-1, -2, -1]
), dtype="float32") #Laplacian 算子
dst = cv2.filter2D(src, -1, kernel)
htich = np.hstack((src, dst))
plt.imshow(htich)
plt.title('Original image & processed image')
plt.show()
#基于Canny算子
img = cv2.imread("Imgs4EXP3/rice.jpg",0)
if img is None:
print("the image is not find")
edges1 = cv2.Canny(img,128,200)
edges2 = cv2.Canny(img,32,128)
plt.subplot(131)
plt.imshow(img, cmap='gray')
plt.title('Input Image')
plt.subplot(132)
plt.imshow(edges1, cmap='gray')
plt.title('Edges1 of Image')
plt.subplot(133)
plt.imshow(edges2, cmap='gray')
plt.title('Edges2 of Image')
plt.show()
基于Laplacian算子的边缘检测:
基于Canny算子的边缘检测:
可以看出,基于Laplacian算子的边缘检测比基于Canny算子的边缘检测效果差。
4、将chess.jpg图像文件读入,利用cv2.cornerHarris() 可以用来进行角点检测,要求在原图上绘制出检测出的角点。
import cv2
import numpy as np
p1=cv2.imread("Imgs4EXP3/chess.jpg")
gray_img = cv2.cvtColor(p1,cv2.COLOR_BGR2GRAY)
gray_img = np.float32(gray_img)
# 输入图像必须是float32,最后一个参数在0.04到0.06
harris = cv2.cornerHarris(gray_img,3,3,0.04)
dst = cv2.dilate(harris,None) #形态学滤波-膨胀
#最佳值的阈值选用0.04*dst.max(),可能会根据图像而有所不同。
th = 0.04*dst.max()
#设置角点颜色
p1[dst>th]=[0,0,255]
cv2.imshow("res1",p1)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、读入一组图像:01.jpg和02.jpg, 利用OpenCV提供的SIFT算子检测其特征点及其描述子,要求绘制的特征点是一个个带有方向的圆。
#参考网址:https://jingyan.baidu.com/article/25648fc1528e799191fd00be.html
import numpy as np
import cv2
#from matplotlib import pyplot as plt
imgname1 = 'Imgs4EXP3/01.jpg'
imgname2 = 'Imgs4EXP3/02.jpg'
#使用xfeatures2d.SIFT_create完成SIFT特征点初始化
sift = cv2.SIFT_create()
img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
#sift.detectAndCompute实现特征点和特征点描述分别输出。keypoints, features。特征点描述,后期用于匹配。
kp1, des1 = sift.detectAndCompute(img1,None) #des 是描述子
img2 = cv2.imread(imgname2)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#灰度处理图像
kp2, des2 = sift.detectAndCompute(img2,None) #des 是描述子
hmerge = np.hstack((gray1, gray2)) #水平拼接
cv2.imshow("gray", hmerge) #拼接显示为 gray
cv2.waitKey(0)
#使用opencv自带的drawKeypoints画圈
img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈 ,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) #对每一个特征点绘制带大小和方向的关键点图形
img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255)) #画出特征点,并显示为红色圆圈 ,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
hmerge = np.hstack((img3, img4)) #水平拼接
cv2.imshow("point", hmerge) #拼接显示为 gray
cv2.waitKey(0)
# BFMatcher 解决匹配
bf = cv2.BFMatcher()
#BFMatcher.knnMatch(),返回k个最佳匹配,其中k由用户指定.
matches = bf.knnMatch(des1,des2, k=2)
#函数cv2.drawMatchsKnn为每个关键点和它的最佳匹配点绘制匹配线
img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches[:10],None,flags=2)
cv2.imshow("BFmatch", img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、实验用图片下载
百度网盘下载链接:https://pan.baidu.com/s/1ZEpdmJ0O4fWuG-JSepPUYg
提取码:l7vs
本文含有隐藏内容,请 开通VIP 后查看