【计算机视觉 实验三 特征检测】

上一篇:计算机视觉 实验二 图像增强

一、实验目的

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值