数字图像处理也是一个广泛而深入的领域,涉及多个章节和主题。
图像获取与表示: 学习如何获取和表示数字图像,包括不同的图像格式和编码方法。
图像增强: 改善图像质量,使其更适合特定应用,例如增加对比度、降噪或锐化。
空域滤波: 在图像的像素级别进行操作,如平滑、锐化和边缘检测。
频域滤波: 将图像转换到频域,进行频域滤波操作,如傅里叶变换和频域滤波器。
图像压缩: 减小图像文件大小,以便更有效地存储和传输,包括有损和无损压缩方法。
颜色图像处理: 处理彩色图像,包括颜色空间转换、颜色增强和彩色图像分割。
形态学处理: 基于形状和结构的操作,用于图像分割、去噪和特征提取。
图像分割与对象识别: 将图像分成不同的区域,并识别和分析图像中的对象。
图像描述与特征提取: 识别和提取图像中的关键特征,如纹理、形状和边缘。
图像恢复与重建: 通过修复受损或缺失的图像信息,使其更接近原始状态。
图像获取:
imread
: 读取图像文件,常见的图像格式包括 JPEG、PNG、BMP 等。videoCapture
: 用于从摄像头或视频文件中获取图像帧。图像表示:
imshow
: 在窗口中显示图像。imwrite
: 将图像保存为文件,通常用于存储处理后的图像。颜色空间转换:
cvtColor
: 用于将图像在不同颜色空间之间进行转换,如 RGB 到灰度、RGB 到 HSV 等。像素操作:
img(x, y)
: 获取图像中特定坐标 (x, y)
处的像素值。img(x, y) = value
: 设置图像中特定坐标 (x, y)
处的像素值为给定的值。图像信息:
size
: 返回图像的尺寸,通常是行数和列数。channels
: 返回图像的通道数,如灰度图像为 1,彩色图像为 3。图像处理:
resize
: 调整图像的大小。rotate
: 旋转图像。flip
: 翻转图像,可以水平翻转或垂直翻转。使用opencv代码实践
pip install opencv-python
使用cv2.imread
从文件中读取图像,cv2.imshow
显示图像,cv2.imwrite
保存图像。
import cv2
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 显示原始图像
cv2.imshow('Original Image', img)
cv2.waitKey(0) # 等待按键
# 保存图像
output_path = 'path/to/save/result_image.jpg'
cv2.imwrite(output_path, img)
print(f"图像已保存至 {output_path}")
# 关闭图像窗口
cv2.destroyAllWindows()
图像增强
直方图均衡化:
equalizeHist
: 对图像进行直方图均衡化,增强图像的对比度。对比度和亮度调整:
convertTo
: 将图像像素值缩放到指定的范围,以调整亮度和对比度。addWeighted
: 将两幅图像进行加权相加,用于调整图像的亮度。自适应直方图均衡化:
createCLAHE
: 创建自适应直方图均衡化的对象,用于处理局部对比度不均匀的图像区域。滤波器操作:
GaussianBlur
) 和均值滤波 (blur
),用于平滑图像和去除噪声。锐化和边缘增强:
filter2D
: 对图像应用自定义的卷积核,用于锐化图像或增强边缘。颜色增强:
Gamma校正:
gammaCorrection
: 对图像进行Gamma校正,用于调整图像的亮度和对比度。import cv2
import matplotlib.pyplot as plt
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 进行直方图均衡化
equalized_img = cv2.equalizeHist(img)
# 显示原始图像和增强后的图像
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 2, 2), plt.imshow(equalized_img, cmap='gray'), plt.title('Equalized Image')
plt.show()
# 保存增强后的图像
output_path = 'path/to/save/equalized_image.jpg'
cv2.imwrite(output_path, equalized_img)
print(f"增强后的图像已保存至 {output_path}")
图像变换是数字图像处理中的关键任务,涉及图像在空间、频域或其他领域的变换。
1.仿射变换:
cv2.warpAffine
:应用仿射变换到图像。可以用于平移、旋转、缩放等操作。import cv2
import numpy as np
# 定义仿射变换矩阵
matrix = np.float32([[1, 0, tx], [0, 1, ty]])
# 应用仿射变换
result = cv2.warpAffine(img, matrix, (width, height))
2. 透视变换:
cv2.getPerspectiveTransform
:获取透视变换矩阵。cv2.warpPerspective
:应用透视变换到图像。import cv2
import numpy as np
# 定义原始图像中的四个点和目标图像中的对应四个点
src_points = np.float32([[x1, y1], [x2, y2], [x3, y3], [x4, y4]])
dst_points = np.float32([[u1, v1], [u2, v2], [u3, v3], [u4, v4]])
# 获取透视变换矩阵
matrix = cv2.getPerspectiveTransform(src_points, dst_points)
# 应用透视变换
result = cv2.warpPerspective(img, matrix, (width, height))
3. 图像缩放:
cv2.resize
:调整图像的大小。import cv2
# 缩放图像
result = cv2.resize(img, (new_width, new_height))
4.图像旋转:
cv2.getRotationMatrix2D
:获取图像旋转矩阵。cv2.warpAffine
:应用旋转变换到图像。import cv2
import numpy as np
# 定义旋转中心和旋转角度
center = (img.shape[1] // 2, img.shape[0] // 2)
angle = 45
# 获取旋转矩阵
matrix = cv2.getRotationMatrix2D(center, angle, scale=1.0)
# 应用旋转变换
result = cv2.warpAffine(img, matrix, (width, height))
空域滤波是数字图像处理中常用的一种技术,它在图像的像素级别进行操作,包括平滑、锐化和边缘检测等。
平均滤波:
blur
或 boxFilter
: 对图像进行平均滤波,用于平滑图像和降低噪声。高斯滤波:
GaussianBlur
: 使用高斯核对图像进行平滑处理,保留图像中的主要特征。中值滤波:
medianBlur
: 对图像进行中值滤波,有效地去除椒盐噪声等离群点。双边滤波:
bilateralFilter
: 保留图像的边缘信息的同时进行平滑,适用于保留细节的情况。自定义滤波器:
filter2D
: 对图像应用自定义的卷积核,可以实现各种空域滤波操作,如锐化和边缘增强。
import cv2
import matplotlib.pyplot as plt
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 使用高斯滤波进行平滑处理
blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
# 显示原始图像和平滑处理后的图像
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 2, 2), plt.imshow(blurred_img, cmap='gray'), plt.title('Blurred Image')
plt.show()
# 保存平滑处理后的图像
output_path = 'path/to/save/blurred_image.jpg'
cv2.imwrite(output_path, blurred_img)
print(f"平滑处理后的图像已保存至 {output_path}")
频域滤波是数字图像处理中的一种重要技术,它涉及将图像转换到频域(通过傅里叶变换等),在频域中进行滤波操作,然后再转换回空域。
傅里叶变换:
fft2
:对图像进行二维傅里叶变换。ifft2
:对频域图像进行反傅里叶变换,将其转换回空域。频域滤波:
freqFilter
: 使用理想滤波器进行频域滤波,通常包括低通滤波器和高通滤波器。butterworthFilter
: 使用巴特沃斯滤波器进行频域滤波,可以调整滤波器的阶数和截止频率。gaussianFilter
: 使用高斯滤波器进行频域滤波,通常用于平滑图像。使用傅里叶变换和频域滤波器对图像进行高通滤波
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 进行傅里叶变换
f_transform = np.fft.fft2(img)
f_shift = np.fft.fftshift(f_transform)
# 构建高通滤波器
rows, cols = img.shape
crow, ccol = rows // 2 , cols // 2
mask = np.ones((rows, cols), np.uint8)
r = 30 # 设置高通滤波器半径
center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r
mask[mask_area] = 0
# 将滤波器应用于频域图像
f_shift = f_shift * mask
# 进行傅里叶逆变换
f_ishift = np.fft.ifftshift(f_shift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
# 显示原始图像和高通滤波后的图像
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 2, 2), plt.imshow(img_back, cmap='gray'), plt.title('High Pass Filtered Image')
plt.show()
# 保存高通滤波后的图像
output_path = 'path/to/save/high_pass_filtered_image.jpg'
cv2.imwrite(output_path, img_back)
print(f"高通滤波后的图像已保存至 {output_path}")
图像压缩在数字图像处理中是一个重要的步骤,它有助于减小图像文件的大小,以便更有效地存储和传输。
有损压缩:
imwrite
(OpenCV):使用JPEG格式进行图像压缩,可以设置压缩质量参数。writeWebP
(OpenCV):使用WebP格式进行图像压缩,支持有损和无损压缩。无损压缩:
imwrite
(OpenCV):使用PNG格式进行无损图像压缩,适用于需要保留图像质量的场景。imageio
(Python库):用于处理GIF图像格式,支持无损压缩。调整压缩参数:
import cv2
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 设置JPEG压缩参数
compress_params = [cv2.IMWRITE_JPEG_QUALITY, 90] # 设置压缩质量,范围为0到100
# 保存压缩后的图像
output_path = 'path/to/save/compressed_image.jpg'
cv2.imwrite(output_path, img, compress_params)
print(f"压缩后的图像已保存至 {output_path}")
颜色图像处理涉及到对彩色图像中的颜色信息进行操作和调整。
颜色空间转换:
cvtColor
(OpenCV等库):用于在不同颜色空间之间进行转换,如RGB到HSV、RGB到LAB等。颜色增强和调整:
adjust_saturation
(Pillow库):调整图像的饱和度。adjust_brightness
(Pillow库):调整图像的亮度。adjust_contrast
(Pillow库):调整图像的对比度。通道拆分与合并:
split
和 merge
(OpenCV等库):分别用于将彩色图像的通道拆分和合并。颜色直方图:
calcHist
(OpenCV等库):计算图像的颜色直方图,用于分析颜色分布。颜色滤波:
inRange
(OpenCV等库):根据颜色范围过滤图像中的像素,用于颜色分割和筛选。颜色空间中的运算:
调整图像的饱和度、亮度和对比度
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 从文件中读取彩色图像
image_path = 'path/to/your/color_image.jpg'
img = cv2.imread(image_path)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 将图像从BGR颜色空间转换为HSV颜色空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 调整图像的饱和度、亮度和对比度
saturation_factor = 1.5
brightness_factor = 1.2
contrast_factor = 1.2
hsv_img[:, :, 1] = np.clip(hsv_img[:, :, 1] * saturation_factor, 0, 255)
hsv_img[:, :, 2] = np.clip(hsv_img[:, :, 2] * brightness_factor, 0, 255)
img_processed = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
img_processed = np.clip(img_processed * contrast_factor, 0, 255).astype(np.uint8)
# 显示原始图像和处理后的图像
plt.subplot(1, 2, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(1, 2, 2), plt.imshow(cv2.cvtColor(img_processed, cv2.COLOR_BGR2RGB)), plt.title('Processed Image')
plt.show()
# 保存处理后的图像
output_path = 'path/to/save/processed_image.jpg'
cv2.imwrite(output_path, img_processed)
print(f"处理后的图像已保存至 {output_path}")
将
image_path
替换为你实际彩色图像文件的路径。在上述代码中,你可以调整saturation_factor
、brightness_factor
和contrast_factor
来改变图像的饱和度、亮度和对比度。
形态学处理是数字图像处理中一种基于形状和结构的操作技术,通常用于图像的分割、去噪和特征提取。
腐蚀与膨胀:
erode
和 dilate
(OpenCV等库):分别用于腐蚀和膨胀图像,可以通过指定结构元素的形状和大小来调整操作效果。开运算与闭运算:
morphologyEx
(OpenCV等库):执行开运算和闭运算,是腐蚀和膨胀的组合操作,常用于去噪和平滑图像。形态学梯度:
morphologyEx
(OpenCV等库):计算图像的形态学梯度,用于检测图像中的边缘。顶帽运算和底帽运算:
morphologyEx
(OpenCV等库):执行顶帽运算和底帽运算,用于突出图像中的亮部分或暗部分。击中与缺失:
morphologyEx
(OpenCV等库):用于执行击中与缺失操作,通常用于形态学重建。结构元素:
getStructuringElement
(OpenCV等库):创建形态学操作中使用的结构元素,可以是矩形、椭圆或自定义形状。使用腐蚀、膨胀、开运算和闭运算来处理二值图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 从文件中读取二值图像
image_path = 'path/to/your/binary_image.jpg'
binary_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功读取
if binary_img is None:
print("无法读取图像,请检查文件路径")
else:
# 二值化处理
_, binary_img = cv2.threshold(binary_img, 128, 255, cv2.THRESH_BINARY)
# 定义结构元素(核)
kernel = np.ones((5, 5), np.uint8)
# 进行腐蚀操作
erosion = cv2.erode(binary_img, kernel, iterations=1)
# 进行膨胀操作
dilation = cv2.dilate(binary_img, kernel, iterations=1)
# 进行开运算(先腐蚀后膨胀)
opening = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
# 进行闭运算(先膨胀后腐蚀)
closing = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
# 显示原始图像和形态学处理后的图像
plt.subplot(2, 3, 1), plt.imshow(binary_img, cmap='gray'), plt.title('Original Binary Image')
plt.subplot(2, 3, 2), plt.imshow(erosion, cmap='gray'), plt.title('Erosion')
plt.subplot(2, 3, 3), plt.imshow(dilation, cmap='gray'), plt.title('Dilation')
plt.subplot(2, 3, 4), plt.imshow(opening, cmap='gray'), plt.title('Opening')
plt.subplot(2, 3, 5), plt.imshow(closing, cmap='gray'), plt.title('Closing')
plt.show()
# 保存形态学处理后的图像
output_path = 'path/to/save/morphology_processed_image.jpg'
cv2.imwrite(output_path, closing)
print(f"形态学处理后的图像已保存至 {output_path}")
将
image_path
替换为你实际的二值图像文件路径。在上述代码中,通过使用腐蚀、膨胀、开运算和闭运算等形态学处理操作,可以改变二值图像的形状和结构。
图像分割和对象识别是数字图像处理中的重要任务,涉及将图像分成不同的区域并识别其中的对象。
阈值分割:
threshold
(OpenCV等库):通过设定阈值将图像分为两个区域,用于简单的二值图像分割。区域增长:
边缘检测:
Canny
(OpenCV等库):用于检测图像中的边缘,边缘通常是图像分割的起点。连通组件标记:
connectedComponents
(OpenCV等库):标记图像中的连通组件,用于分离不同的对象。分水岭算法:
watershed
(OpenCV等库):基于水流模型的图像分割算法,适用于物体之间有重叠的情况。轮廓提取:
findContours
(OpenCV等库):用于提取图像中的轮廓,可用于对象的形状分析和识别。对象识别:
特征提取:
使用阈值分割和连通组件标记来分割图像中的物体
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 从文件中读取彩色图像
image_path = 'path/to/your/color_image.jpg'
img = cv2.imread(image_path)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 将图像从BGR颜色空间转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用阈值分割
_, binary_img = cv2.threshold(gray_img, 128, 255, cv2.THRESH_BINARY)
# 进行连通组件标记
_, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_img)
# 显示原始图像、阈值分割后的图像和连通组件标记
plt.subplot(1, 3, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(1, 3, 2), plt.imshow(binary_img, cmap='gray'), plt.title('Thresholded Image')
plt.subplot(1, 3, 3), plt.imshow(labels, cmap='viridis'), plt.title('Connected Components')
plt.show()
# 输出连通组件的统计信息
print(f"共检测到 {len(stats) - 1} 个对象")
# 保存分割后的图像和连通组件标记
output_path_binary = 'path/to/save/binary_image.jpg'
output_path_labels = 'path/to/save/connected_components.jpg'
cv2.imwrite(output_path_binary, binary_img)
cv2.imwrite(output_path_labels, labels)
print(f"分割后的二值图像已保存至 {output_path_binary}")
print(f"连通组件标记图像已保存至 {output_path_labels}")
将
image_path
替换为你实际彩色图像文件的路径。在上述代码中,我们使用阈值分割将图像转换为二值图像,并使用connectedComponentsWithStats
函数进行连通组件标记。最后,我们显示原始图像、阈值分割后的图像和连通组件标记的图像。
图像描述和特征提取是数字图像处理中的关键任务,用于识别和描述图像中的关键特征。
特征点检测:
goodFeaturesToTrack
(OpenCV等库):检测图像中的关键特征点,如角点。角点检测:
cornerHarris
(OpenCV等库):使用Harris角点检测算法检测图像中的角点。SIFT(尺度不变特征变换):
SIFT_create
(OpenCV等库):使用尺度空间来检测和描述图像中的关键点。SURF(加速稳健特征):
SURF_create
(OpenCV等库):使用加速稳健特征算法进行图像的关键点检测和描述。ORB(Oriented FAST and Rotated BRIEF):
ORB_create
(OpenCV等库):一种具有旋转不变性的特征检测和描述算法。HOG(方向梯度直方图):
HOGDescriptor
(OpenCV等库):用于检测图像中的物体轮廓和纹理特征。颜色直方图:
calcHist
(OpenCV等库):计算图像的颜色直方图,用于颜色特征描述。纹理特征提取:
深度学习特征提取:
使用SIFT算法检测并描述图像中的关键点
import cv2
import matplotlib.pyplot as plt
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 使用SIFT算法检测关键点和计算描述符
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
# 绘制关键点
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)
# 显示原始图像和带有关键点的图像
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 2, 2), plt.imshow(img_with_keypoints, cmap='gray'), plt.title('Image with Keypoints')
plt.show()
# 输出关键点的数量
print(f"检测到 {len(keypoints)} 个关键点")
# 保存带有关键点的图像
output_path = 'path/to/save/image_with_keypoints.jpg'
cv2.imwrite(output_path, img_with_keypoints)
print(f"带有关键点的图像已保存至 {output_path}")
将
image_path
替换为你实际图像文件的路径。在上述代码中,我们使用SIFT算法检测图像中的关键点,并计算每个关键点的描述符。最后,我们绘制关键点并显示原始图像和带有关键点的图像。
图像恢复和重建是数字图像处理中的重要任务,涉及修复受损或模糊的图像,使其更接近原始状态。
图像去噪:
fastNlMeansDenoising
(OpenCV等库):使用非局部均值去噪算法进行图像去噪。图像去模糊:
deconvolution
:使用盲源分离或Wiener滤波等技术进行图像去模糊。超分辨率重建:
superResolution
(OpenCV等库):通过图像金字塔或深度学习模型进行超分辨率重建,提高图像的空间分辨率。图像修复:
inpaint
(OpenCV等库):使用图像修复算法填补图像中的缺失或损坏部分。运动模糊恢复:
deblur
:通过对运动模糊进行逆滤波或使用复杂的运动模型进行图像恢复。模型基础的图像重建:
图像插值:
resize
(OpenCV等库):使用插值算法调整图像的大小,可以用于图像的简单重建。使用非局部均值去噪算法和图像插值进行图像重建
import cv2
import matplotlib.pyplot as plt
# 从文件中读取图像
image_path = 'path/to/your/image.jpg'
img = cv2.imread(image_path)
# 检查图像是否成功读取
if img is None:
print("无法读取图像,请检查文件路径")
else:
# 转换图像为灰度
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行非局部均值去噪
denoised_img = cv2.fastNlMeansDenoising(gray_img, None, h=15, templateWindowSize=7, searchWindowSize=21)
# 使用双立方插值进行图像重建
resized_img = cv2.resize(denoised_img, (img.shape[1]*2, img.shape[0]*2), interpolation=cv2.INTER_CUBIC)
# 显示原始图像、去噪后的图像和重建后的图像
plt.subplot(1, 3, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(1, 3, 2), plt.imshow(denoised_img, cmap='gray'), plt.title('Denoised Image')
plt.subplot(1, 3, 3), plt.imshow(resized_img, cmap='gray'), plt.title('Reconstructed Image')
plt.show()
# 保存去噪后的图像和重建后的图像
output_path_denoised = 'path/to/save/denoised_image.jpg'
output_path_reconstructed = 'path/to/save/reconstructed_image.jpg'
cv2.imwrite(output_path_denoised, denoised_img)
cv2.imwrite(output_path_reconstructed, resized_img)
print(f"去噪后的图像已保存至 {output_path_denoised}")
print(f"重建后的图像已保存至 {output_path_reconstructed}")
将
image_path
替换为你实际图像文件的路径。在上述代码中,我们首先使用非局部均值去噪算法对图像进行去噪,然后使用双立方插值进行图像的重建
图像配准是将两个或多个图像对齐以便进一步分析或融合的过程。
1. 特征点匹配:
cv2.SIFT
、cv2.SURF
、cv2.ORB
等:用于检测和描述图像中的特征点。cv2.BFMatcher
、cv2.FlannBasedMatcher
等:用于特征点匹配。
import cv2
# 使用SIFT检测特征点和计算描述符
sift = cv2.SIFT_create()
keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)
# 使用BFMatcher进行特征点匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(descriptors1, descriptors2, k=2)
# 进行筛选,根据最佳/次优比率
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
# 绘制匹配结果
img_matches = cv2.drawMatches(image1, keypoints1, image2, keypoints2, good_matches, None)
cv2.imshow('Matches', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 透视变换:
使用特征点匹配后,可以使用透视变换进行图像配准。
import cv2
import numpy as np
# 获取匹配的特征点
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
# 计算透视变换矩阵
matrix, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# 应用透视变换
result = cv2.warpPerspective(image1, matrix, (width, height))