【数字图像处理】万字长文的数字图像处理全貌

发布时间:2024年01月06日

数字图像处理

数字图像处理也是一个广泛而深入的领域,涉及多个章节和主题。

  1. 图像获取与表示: 学习如何获取和表示数字图像,包括不同的图像格式和编码方法。

  2. 图像增强: 改善图像质量,使其更适合特定应用,例如增加对比度、降噪或锐化。

  3. 空域滤波: 在图像的像素级别进行操作,如平滑、锐化和边缘检测。

  4. 频域滤波: 将图像转换到频域,进行频域滤波操作,如傅里叶变换和频域滤波器。

  5. 图像压缩: 减小图像文件大小,以便更有效地存储和传输,包括有损和无损压缩方法。

  6. 颜色图像处理: 处理彩色图像,包括颜色空间转换、颜色增强和彩色图像分割。

  7. 形态学处理: 基于形状和结构的操作,用于图像分割、去噪和特征提取。

  8. 图像分割与对象识别: 将图像分成不同的区域,并识别和分析图像中的对象。

  9. 图像描述与特征提取: 识别和提取图像中的关键特征,如纹理、形状和边缘。

  10. 图像恢复与重建: 通过修复受损或缺失的图像信息,使其更接近原始状态。

?图像获取与表示

?

  1. 图像获取:

    • imread: 读取图像文件,常见的图像格式包括 JPEG、PNG、BMP 等。
    • videoCapture: 用于从摄像头或视频文件中获取图像帧。
  2. 图像表示:

    • imshow: 在窗口中显示图像。
    • imwrite: 将图像保存为文件,通常用于存储处理后的图像。
  3. 颜色空间转换:

    • cvtColor: 用于将图像在不同颜色空间之间进行转换,如 RGB 到灰度、RGB 到 HSV 等。
  4. 像素操作:

    • img(x, y): 获取图像中特定坐标 (x, y) 处的像素值。
    • img(x, y) = value: 设置图像中特定坐标 (x, y) 处的像素值为给定的值。
  5. 图像信息:

    • size: 返回图像的尺寸,通常是行数和列数。
    • channels: 返回图像的通道数,如灰度图像为 1,彩色图像为 3。
  6. 图像处理:

    • 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()

?图像增强

  1. 直方图均衡化:

    • equalizeHist: 对图像进行直方图均衡化,增强图像的对比度。
  2. 对比度和亮度调整:

    • convertTo: 将图像像素值缩放到指定的范围,以调整亮度和对比度。
    • addWeighted: 将两幅图像进行加权相加,用于调整图像的亮度。
  3. 自适应直方图均衡化:

    • createCLAHE: 创建自适应直方图均衡化的对象,用于处理局部对比度不均匀的图像区域。
  4. 滤波器操作:

    • 一维和二维滤波器,如高斯滤波 (GaussianBlur) 和均值滤波 (blur),用于平滑图像和去除噪声。
  5. 锐化和边缘增强:

    • filter2D: 对图像应用自定义的卷积核,用于锐化图像或增强边缘。
  6. 颜色增强:

    • 调整图像的颜色饱和度、色调和亮度,以增强彩色图像的视觉效果。
  7. 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))

?空域滤波

空域滤波是数字图像处理中常用的一种技术,它在图像的像素级别进行操作,包括平滑、锐化和边缘检测等。

  1. 平均滤波:

    • blurboxFilter: 对图像进行平均滤波,用于平滑图像和降低噪声。
  2. 高斯滤波:

    • GaussianBlur: 使用高斯核对图像进行平滑处理,保留图像中的主要特征。
  3. 中值滤波:

    • medianBlur: 对图像进行中值滤波,有效地去除椒盐噪声等离群点。
  4. 双边滤波:

    • bilateralFilter: 保留图像的边缘信息的同时进行平滑,适用于保留细节的情况。
  5. 自定义滤波器:

    • 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}")

频域滤波

?频域滤波是数字图像处理中的一种重要技术,它涉及将图像转换到频域(通过傅里叶变换等),在频域中进行滤波操作,然后再转换回空域。

  1. 傅里叶变换:

    • fft2:对图像进行二维傅里叶变换。
    • ifft2:对频域图像进行反傅里叶变换,将其转换回空域。
  2. 频域滤波:

    • 理想滤波器:
      • 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}")

?图像压缩

?图像压缩在数字图像处理中是一个重要的步骤,它有助于减小图像文件的大小,以便更有效地存储和传输。

?

  1. 有损压缩:

    • JPEG压缩:
      • imwrite(OpenCV):使用JPEG格式进行图像压缩,可以设置压缩质量参数。
    • WebP压缩:
      • writeWebP(OpenCV):使用WebP格式进行图像压缩,支持有损和无损压缩。
  2. 无损压缩:

    • PNG压缩:
      • imwrite(OpenCV):使用PNG格式进行无损图像压缩,适用于需要保留图像质量的场景。
    • GIF压缩:
      • imageio(Python库):用于处理GIF图像格式,支持无损压缩。
  3. 调整压缩参数:

    • 在使用相应库的图像写入函数时,通常可以设置压缩参数,例如压缩质量、压缩级别等。

?

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}")

颜色图像处理

?颜色图像处理涉及到对彩色图像中的颜色信息进行操作和调整。

?

  1. 颜色空间转换:

    • cvtColor(OpenCV等库):用于在不同颜色空间之间进行转换,如RGB到HSV、RGB到LAB等。
  2. 颜色增强和调整:

    • adjust_saturation(Pillow库):调整图像的饱和度。
    • adjust_brightness(Pillow库):调整图像的亮度。
    • adjust_contrast(Pillow库):调整图像的对比度。
  3. 通道拆分与合并:

    • splitmerge(OpenCV等库):分别用于将彩色图像的通道拆分和合并。
  4. 颜色直方图:

    • calcHist(OpenCV等库):计算图像的颜色直方图,用于分析颜色分布。
  5. 颜色滤波:

    • inRange(OpenCV等库):根据颜色范围过滤图像中的像素,用于颜色分割和筛选。
  6. 颜色空间中的运算:

    • 在某些情况下,可以在颜色空间中执行各种运算,例如在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.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_factorbrightness_factorcontrast_factor来改变图像的饱和度、亮度和对比度。

形态学处理?

?形态学处理是数字图像处理中一种基于形状和结构的操作技术,通常用于图像的分割、去噪和特征提取。

?

  1. 腐蚀与膨胀:

    • erodedilate(OpenCV等库):分别用于腐蚀和膨胀图像,可以通过指定结构元素的形状和大小来调整操作效果。
  2. 开运算与闭运算:

    • morphologyEx(OpenCV等库):执行开运算和闭运算,是腐蚀和膨胀的组合操作,常用于去噪和平滑图像。
  3. 形态学梯度:

    • morphologyEx(OpenCV等库):计算图像的形态学梯度,用于检测图像中的边缘。
  4. 顶帽运算和底帽运算:

    • morphologyEx(OpenCV等库):执行顶帽运算和底帽运算,用于突出图像中的亮部分或暗部分。
  5. 击中与缺失:

    • morphologyEx(OpenCV等库):用于执行击中与缺失操作,通常用于形态学重建。
  6. 结构元素:

    • 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替换为你实际的二值图像文件路径。在上述代码中,通过使用腐蚀、膨胀、开运算和闭运算等形态学处理操作,可以改变二值图像的形状和结构。

图像分割与对象识别?

?图像分割和对象识别是数字图像处理中的重要任务,涉及将图像分成不同的区域并识别其中的对象。

?

  1. 阈值分割:

    • threshold(OpenCV等库):通过设定阈值将图像分为两个区域,用于简单的二值图像分割。
  2. 区域增长:

    • 可以通过自定义算法实现区域增长,逐步生长具有相似特征的图像区域。
  3. 边缘检测:

    • Canny(OpenCV等库):用于检测图像中的边缘,边缘通常是图像分割的起点。
  4. 连通组件标记:

    • connectedComponents(OpenCV等库):标记图像中的连通组件,用于分离不同的对象。
  5. 分水岭算法:

    • watershed(OpenCV等库):基于水流模型的图像分割算法,适用于物体之间有重叠的情况。
  6. 轮廓提取:

    • findContours(OpenCV等库):用于提取图像中的轮廓,可用于对象的形状分析和识别。
  7. 对象识别:

    • 使用机器学习和深度学习技术,如卷积神经网络(CNN),对图像中的对象进行识别和分类。
  8. 特征提取:

    • 提取对象的特征,例如颜色直方图、纹理特征等,用于对象的描述和识别。

使用阈值分割和连通组件标记来分割图像中的物体

?

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函数进行连通组件标记。最后,我们显示原始图像、阈值分割后的图像和连通组件标记的图像。

图像描述与特征提取?

?图像描述和特征提取是数字图像处理中的关键任务,用于识别和描述图像中的关键特征。

?

  1. 特征点检测:

    • goodFeaturesToTrack(OpenCV等库):检测图像中的关键特征点,如角点。
  2. 角点检测:

    • cornerHarris(OpenCV等库):使用Harris角点检测算法检测图像中的角点。
  3. SIFT(尺度不变特征变换):

    • SIFT_create(OpenCV等库):使用尺度空间来检测和描述图像中的关键点。
  4. SURF(加速稳健特征):

    • SURF_create(OpenCV等库):使用加速稳健特征算法进行图像的关键点检测和描述。
  5. ORB(Oriented FAST and Rotated BRIEF):

    • ORB_create(OpenCV等库):一种具有旋转不变性的特征检测和描述算法。
  6. HOG(方向梯度直方图):

    • HOGDescriptor(OpenCV等库):用于检测图像中的物体轮廓和纹理特征。
  7. 颜色直方图:

    • calcHist(OpenCV等库):计算图像的颜色直方图,用于颜色特征描述。
  8. 纹理特征提取:

    • 使用各种滤波器和算法,如Gabor滤波器,来提取图像中的纹理特征。
  9. 深度学习特征提取:

    • 使用预训练的卷积神经网络(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, 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算法检测图像中的关键点,并计算每个关键点的描述符。最后,我们绘制关键点并显示原始图像和带有关键点的图像。

图像恢复与重建?

图像恢复和重建是数字图像处理中的重要任务,涉及修复受损或模糊的图像,使其更接近原始状态。?

  1. 图像去噪:

    • fastNlMeansDenoising(OpenCV等库):使用非局部均值去噪算法进行图像去噪。
  2. 图像去模糊:

    • deconvolution:使用盲源分离或Wiener滤波等技术进行图像去模糊。
  3. 超分辨率重建:

    • superResolution(OpenCV等库):通过图像金字塔或深度学习模型进行超分辨率重建,提高图像的空间分辨率。
  4. 图像修复:

    • inpaint(OpenCV等库):使用图像修复算法填补图像中的缺失或损坏部分。
  5. 运动模糊恢复:

    • deblur:通过对运动模糊进行逆滤波或使用复杂的运动模型进行图像恢复。
  6. 模型基础的图像重建:

    • 使用图像重建算法,如基于字典学习的算法,通过学习图像的结构和特征进行图像重建。
  7. 图像插值:

    • 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.SIFTcv2.SURFcv2.ORB等:用于检测和描述图像中的特征点。
  • cv2.BFMatchercv2.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))

?

文章来源:https://blog.csdn.net/qq_44091004/article/details/135419318
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。