青海网站建设,微信公众号和小程序区别,网站制作教程:初学者,一个完整的工程项目流程数字图像处理
数字图像处理也是一个广泛而深入的领域#xff0c;涉及多个章节和主题。 图像获取与表示#xff1a; 学习如何获取和表示数字图像#xff0c;包括不同的图像格式和编码方法。 图像增强#xff1a; 改善图像质量#xff0c;使其更适合特定应用#xff0c;例…数字图像处理
数字图像处理也是一个广泛而深入的领域涉及多个章节和主题。 图像获取与表示 学习如何获取和表示数字图像包括不同的图像格式和编码方法。 图像增强 改善图像质量使其更适合特定应用例如增加对比度、降噪或锐化。 空域滤波 在图像的像素级别进行操作如平滑、锐化和边缘检测。 频域滤波 将图像转换到频域进行频域滤波操作如傅里叶变换和频域滤波器。 图像压缩 减小图像文件大小以便更有效地存储和传输包括有损和无损压缩方法。 颜色图像处理 处理彩色图像包括颜色空间转换、颜色增强和彩色图像分割。 形态学处理 基于形状和结构的操作用于图像分割、去噪和特征提取。 图像分割与对象识别 将图像分成不同的区域并识别和分析图像中的对象。 图像描述与特征提取 识别和提取图像中的关键特征如纹理、形状和边缘。 图像恢复与重建 通过修复受损或缺失的图像信息使其更接近原始状态。 图像获取与表示 图像获取 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.jpgcv2.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, cmapgray), plt.title(Original Image)plt.subplot(1, 2, 2), plt.imshow(equalized_img, cmapgray), plt.title(Equalized Image)plt.show()# 保存增强后的图像output_path path/to/save/equalized_image.jpgcv2.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, scale1.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, cmapgray), plt.title(Original Image)plt.subplot(1, 2, 2), plt.imshow(blurred_img, cmapgray), plt.title(Blurred Image)plt.show()# 保存平滑处理后的图像output_path path/to/save/blurred_image.jpgcv2.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.shapecrow, ccol rows // 2 , cols // 2mask 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*rmask[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, cmapgray), plt.title(Original Image)plt.subplot(1, 2, 2), plt.imshow(img_back, cmapgray), plt.title(High Pass Filtered Image)plt.show()# 保存高通滤波后的图像output_path path/to/save/high_pass_filtered_image.jpgcv2.imwrite(output_path, img_back)print(f高通滤波后的图像已保存至 {output_path})图像压缩 图像压缩在数字图像处理中是一个重要的步骤它有助于减小图像文件的大小以便更有效地存储和传输。 有损压缩 JPEG压缩 imwriteOpenCV使用JPEG格式进行图像压缩可以设置压缩质量参数。WebP压缩 writeWebPOpenCV使用WebP格式进行图像压缩支持有损和无损压缩。 无损压缩 PNG压缩 imwriteOpenCV使用PNG格式进行无损图像压缩适用于需要保留图像质量的场景。GIF压缩 imageioPython库用于处理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.jpgcv2.imwrite(output_path, img, compress_params)print(f压缩后的图像已保存至 {output_path})颜色图像处理 颜色图像处理涉及到对彩色图像中的颜色信息进行操作和调整。 颜色空间转换 cvtColorOpenCV等库用于在不同颜色空间之间进行转换如RGB到HSV、RGB到LAB等。 颜色增强和调整 adjust_saturationPillow库调整图像的饱和度。adjust_brightnessPillow库调整图像的亮度。adjust_contrastPillow库调整图像的对比度。 通道拆分与合并 split 和 mergeOpenCV等库分别用于将彩色图像的通道拆分和合并。 颜色直方图 calcHistOpenCV等库计算图像的颜色直方图用于分析颜色分布。 颜色滤波 inRangeOpenCV等库根据颜色范围过滤图像中的像素用于颜色分割和筛选。 颜色空间中的运算 在某些情况下可以在颜色空间中执行各种运算例如在Lab颜色空间中执行对比度增强。 调整图像的饱和度、亮度和对比度 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.5brightness_factor 1.2contrast_factor 1.2hsv_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.jpgcv2.imwrite(output_path, img_processed)print(f处理后的图像已保存至 {output_path})将image_path替换为你实际彩色图像文件的路径。在上述代码中你可以调整saturation_factor、brightness_factor和contrast_factor来改变图像的饱和度、亮度和对比度。 形态学处理 形态学处理是数字图像处理中一种基于形状和结构的操作技术通常用于图像的分割、去噪和特征提取。 腐蚀与膨胀 erode 和 dilateOpenCV等库分别用于腐蚀和膨胀图像可以通过指定结构元素的形状和大小来调整操作效果。 开运算与闭运算 morphologyExOpenCV等库执行开运算和闭运算是腐蚀和膨胀的组合操作常用于去噪和平滑图像。 形态学梯度 morphologyExOpenCV等库计算图像的形态学梯度用于检测图像中的边缘。 顶帽运算和底帽运算 morphologyExOpenCV等库执行顶帽运算和底帽运算用于突出图像中的亮部分或暗部分。 击中与缺失 morphologyExOpenCV等库用于执行击中与缺失操作通常用于形态学重建。 结构元素 getStructuringElementOpenCV等库创建形态学操作中使用的结构元素可以是矩形、椭圆或自定义形状。
使用腐蚀、膨胀、开运算和闭运算来处理二值图像 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, iterations1)# 进行膨胀操作dilation cv2.dilate(binary_img, kernel, iterations1)# 进行开运算先腐蚀后膨胀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, cmapgray), plt.title(Original Binary Image)plt.subplot(2, 3, 2), plt.imshow(erosion, cmapgray), plt.title(Erosion)plt.subplot(2, 3, 3), plt.imshow(dilation, cmapgray), plt.title(Dilation)plt.subplot(2, 3, 4), plt.imshow(opening, cmapgray), plt.title(Opening)plt.subplot(2, 3, 5), plt.imshow(closing, cmapgray), plt.title(Closing)plt.show()# 保存形态学处理后的图像output_path path/to/save/morphology_processed_image.jpgcv2.imwrite(output_path, closing)print(f形态学处理后的图像已保存至 {output_path})将image_path替换为你实际的二值图像文件路径。在上述代码中通过使用腐蚀、膨胀、开运算和闭运算等形态学处理操作可以改变二值图像的形状和结构。 图像分割与对象识别 图像分割和对象识别是数字图像处理中的重要任务涉及将图像分成不同的区域并识别其中的对象。 阈值分割 thresholdOpenCV等库通过设定阈值将图像分为两个区域用于简单的二值图像分割。 区域增长 可以通过自定义算法实现区域增长逐步生长具有相似特征的图像区域。 边缘检测 CannyOpenCV等库用于检测图像中的边缘边缘通常是图像分割的起点。 连通组件标记 connectedComponentsOpenCV等库标记图像中的连通组件用于分离不同的对象。 分水岭算法 watershedOpenCV等库基于水流模型的图像分割算法适用于物体之间有重叠的情况。 轮廓提取 findContoursOpenCV等库用于提取图像中的轮廓可用于对象的形状分析和识别。 对象识别 使用机器学习和深度学习技术如卷积神经网络CNN对图像中的对象进行识别和分类。 特征提取 提取对象的特征例如颜色直方图、纹理特征等用于对象的描述和识别。
使用阈值分割和连通组件标记来分割图像中的物体 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, cmapgray), plt.title(Thresholded Image)plt.subplot(1, 3, 3), plt.imshow(labels, cmapviridis), plt.title(Connected Components)plt.show()# 输出连通组件的统计信息print(f共检测到 {len(stats) - 1} 个对象)# 保存分割后的图像和连通组件标记output_path_binary path/to/save/binary_image.jpgoutput_path_labels path/to/save/connected_components.jpgcv2.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函数进行连通组件标记。最后我们显示原始图像、阈值分割后的图像和连通组件标记的图像。 图像描述与特征提取 图像描述和特征提取是数字图像处理中的关键任务用于识别和描述图像中的关键特征。 特征点检测 goodFeaturesToTrackOpenCV等库检测图像中的关键特征点如角点。 角点检测 cornerHarrisOpenCV等库使用Harris角点检测算法检测图像中的角点。 SIFT尺度不变特征变换 SIFT_createOpenCV等库使用尺度空间来检测和描述图像中的关键点。 SURF加速稳健特征 SURF_createOpenCV等库使用加速稳健特征算法进行图像的关键点检测和描述。 ORBOriented FAST and Rotated BRIEF ORB_createOpenCV等库一种具有旋转不变性的特征检测和描述算法。 HOG方向梯度直方图 HOGDescriptorOpenCV等库用于检测图像中的物体轮廓和纹理特征。 颜色直方图 calcHistOpenCV等库计算图像的颜色直方图用于颜色特征描述。 纹理特征提取 使用各种滤波器和算法如Gabor滤波器来提取图像中的纹理特征。 深度学习特征提取 使用预训练的卷积神经网络CNN模型如VGG、ResNet、或MobileNet提取图像中的高级特征。 使用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, cmapgray), plt.title(Original Image)plt.subplot(1, 2, 2), plt.imshow(img_with_keypoints, cmapgray), plt.title(Image with Keypoints)plt.show()# 输出关键点的数量print(f检测到 {len(keypoints)} 个关键点)# 保存带有关键点的图像output_path path/to/save/image_with_keypoints.jpgcv2.imwrite(output_path, img_with_keypoints)print(f带有关键点的图像已保存至 {output_path})将image_path替换为你实际图像文件的路径。在上述代码中我们使用SIFT算法检测图像中的关键点并计算每个关键点的描述符。最后我们绘制关键点并显示原始图像和带有关键点的图像。 图像恢复与重建
图像恢复和重建是数字图像处理中的重要任务涉及修复受损或模糊的图像使其更接近原始状态。 图像去噪 fastNlMeansDenoisingOpenCV等库使用非局部均值去噪算法进行图像去噪。 图像去模糊 deconvolution使用盲源分离或Wiener滤波等技术进行图像去模糊。 超分辨率重建 superResolutionOpenCV等库通过图像金字塔或深度学习模型进行超分辨率重建提高图像的空间分辨率。 图像修复 inpaintOpenCV等库使用图像修复算法填补图像中的缺失或损坏部分。 运动模糊恢复 deblur通过对运动模糊进行逆滤波或使用复杂的运动模型进行图像恢复。 模型基础的图像重建 使用图像重建算法如基于字典学习的算法通过学习图像的结构和特征进行图像重建。 图像插值 resizeOpenCV等库使用插值算法调整图像的大小可以用于图像的简单重建。 使用非局部均值去噪算法和图像插值进行图像重建
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, h15, templateWindowSize7, searchWindowSize21)# 使用双立方插值进行图像重建resized_img cv2.resize(denoised_img, (img.shape[1]*2, img.shape[0]*2), interpolationcv2.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, cmapgray), plt.title(Denoised Image)plt.subplot(1, 3, 3), plt.imshow(resized_img, cmapgray), plt.title(Reconstructed Image)plt.show()# 保存去噪后的图像和重建后的图像output_path_denoised path/to/save/denoised_image.jpgoutput_path_reconstructed path/to/save/reconstructed_image.jpgcv2.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, k2)# 进行筛选根据最佳/次优比率
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))