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

数字图像处理

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

  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.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, 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.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.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))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows

在当今软件开发领域&#xff0c;团队协作和版本控制是非常重要的方面。在这个过程中&#xff0c;Git成为了最受欢迎的版本控制工具之一。然而&#xff0c;对于Git的使用&#xff0c;一个好的客户端是至关重要的。 今天&#xff0c;我们要为大家介绍一款强大而易用的Git客户端—…

.NET 8.0 本机 AOT

在软件开发领域&#xff0c;优化性能和简化效率仍然至关重要。.NET 平台二十年来不断创新&#xff0c;为开发人员提供了构建弹性且高效的软件解决方案的基础架构。 与本机 AOT&#xff08;提前&#xff09;编译相结合&#xff0c;取得了显着的进步。本文深入研究.NET Native AO…

计算机进入BIOS - Win/Linux

计算机进入BIOS - Win/Linux 快捷键方法&#xff08;通用&#xff09;Win系统方法Linux系统方法 快捷键方法&#xff08;通用&#xff09; 此方法为通用方法&#xff0c;适用于任何型号的计算机&#xff0c;包括台式机和笔记本&#xff0c;也包括Win系统和Linux系统。 进入BI…

OpenCV-Python(28):基于GrabCut 算法交互式前景提取

目标 GrabCut 算法原理&#xff0c;使用GrabCut 算法提取图像的前景 创建一个交互是程序完成前景提取 介绍 GrabCut算法是一种基于图像分割的算法&#xff0c;用于将图像中的前景物体从背景中准确地分离出来。它是由Carsten Rother等人于2004年提出的。 GrabCut算法的基本思想…

C#,入门教程(10)——常量、变量与命名规则的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素&#xff0c;称为“变量”。 其中一般不改变初值的变量&#xff0c;称为常变量&#xff0c;简称“常量”。 无论…

QT工具栏开始,退出

QT工具栏开始&#xff0c;退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…

Pycharm打包程序为exe文件

Pycharm打包程序为exe文件 【一】导入模块pyinstaller 【1】图片说明 【2】文字说明 根据图片顺序执行 首先点击file进入settings界面&#xff0c;在setting界面找到Project下面的Python Interpretor&#xff0c;点击号进行模块的添加在搜索框中输入pyinstaller&#xff0c;…

三、Kubernetes(K8s)入门(一)

视频教程连接k8s 入门到微服务项目实战.xmind链接&#xff1a;https://pan.baidu.com/s/1q04euH7baE8eXNyG3kPPbA 提取码&#xff1a;jej4比较好的笔记 kubectl命令的语法如下&#xff1a; kubectl [command] [type] [name] [flags]comand&#xff1a;指定要对资源执行的操作…

了解单元测试

一&#xff0c;测试分类 1.1 E2E测试&#xff08;end to end端到端测试&#xff09; 属于黑盒测试。 主要通过测试框架&#xff0c;站在用户测试人员的角度&#xff0c;模拟用户的操作进行页面功能的验证&#xff0c;不管内部实现机制&#xff0c;完全模拟浏览器的行为。&am…

任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC]

文章目录 任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关…

C++《异常》

前言&#xff1a;C有一套独立的异常处理机制,今天就来做详细的介绍try,catch这两个词等 在C语言中处理错误的方式和缺陷有&#xff1a; 返回错误码。 缺陷&#xff1a; 1.错误码不好设置&#xff0c;比如&#xff1a;除0操作&#xff0c;就不好返回错误码。如果返回一个数字&…

Flume基础知识(八):Flume 拓扑结构全解

1. 简单串联 这种模式是将多个 flume 顺序连接起来了&#xff0c;从最初的 source 开始到最终 sink 传送的 目的存储系统。此模式不建议桥接过多的 flume 数量&#xff0c; flume 数量过多不仅会影响传输速 率&#xff0c;而且一旦传输过程中某个节点 flume 宕机&#xff0c;会…

LC 2807. 在链表中插入最大公约数

2807. 在链表中插入最大公约数 难度 &#xff1a; 中等 题目大意&#xff1a; 给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表…

thinkphp学习04-控制器定义

控制器&#xff0c;即 controller&#xff0c;控制器文件存放在 controller 目录下&#xff1b; 如果想改变系统默认的控制器文件目录&#xff0c;可以在 config 下 route.php 配置&#xff1a; 将controller修改为controller123&#xff0c;就会报错&#xff0c;说明这个配置…

Sqlmap参数设置

Sqlmap参数设置 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; --------------------------------------------注意---------…

易图讯便携式三维电子沙盘实战应用系统

便携式三维电子沙盘采用军工加固三防高性能笔记本&#xff0c;具有IP65级防尘防水防摔性能&#xff0c;以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;支持高清卫星影像、DEM高程数据、矢量数据、三维模型、倾斜摄像、BIM、点云、城市白模、等高线、标高…

033 - STM32学习笔记 - TIM定时器(一) - 高级定时器

033 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 高级定时器 上节内容学习了基本定时器&#xff0c;其功能比较简单&#xff0c;配置和使用也比较容易&#xff0c;今天在基本定时器的基础上学习一下高级控制定时器的内容。 在F429上一共有两个高级控制定时器和1…

PyTorch|一次画一批图像

想想这样一个场景&#xff0c;我们训练了一个神经网络&#xff0c;输入一些信息&#xff0c;这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张&#xff0c;而是多张&#xff0c;我们想把这些图片一次全部显示出来&#xff0c;而不是一张一张的显示&#xff08;这…

Python蒸发散物理问题(微积分-线性代数-拉普拉斯和傅立叶变换)

使用Python计算解决土壤物理问题的数值。这里数值过程用于求解微分方程&#xff0c;数值方法将微分转化为代数方程&#xff0c;可以使用传统的线性代数方法求解。 Python拉普拉斯变换求解微分方程示例 假设我们有微分方程 y ′ ′ 2 y ′ 16 y cos ⁡ 4 t y^{\prime \pri…

关于unity的组件VerticalLayoutGroup刷新显示不正常的问题

先说明一下我是如何用到&#xff0c;有哪些处理的 用到这个组件基本上都是将列表进行排版操作的&#xff0c;竖着&#xff0c;或者横着&#xff0c;横着用HorizontalLayoutGroup 还有一个和这个组件搭配的组件叫ContentSizeFitter 先说我是怎么发现这个组件不好用的 //本地读取…