同样内容将拆解为一份份,发在我个人博客中
如http://t.csdnimg.cn/icOfX(非VIP文章),整理不易、感谢你的点赞收藏
目录
提取和插入颜色通道 (extractChannel 和 insertChannel)
缩放、计算绝对值并转换为8位 (convertScaleAbs)
快速非局部均值去噪 (fastNlMeansDenoising)
彩色图像的快速非局部均值去噪 (fastNlMeansDenoisingColored)
笛卡尔坐标与极坐标转换 (cartToPolar 和 polarToCart)
获取结构元素 (getStructuringElement)
均值漂移滤波 (pyrMeanShiftFiltering)
计算连通组件并返回统计信息 (connectedComponentsWithStats)
检测并绘制轮廓 (findContours 和 drawContours)
计算轮廓的周长和面积 (arcLength 和 contourArea)
计算包围轮廓的最小矩形和最小圆 (minAreaRect 和 minEnclosingCircle)
测试点与轮廓的相对位置 (pointPolygonTest)
从图像中提取矩形区域的子像素精度补偿 (getRectSubPix)
获取最优的DFT大小 (getOptimalDFTSize)
仿射变换 (warpAffine 和 getAffineTransform)
透视变换 (warpPerspective 和 getPerspectiveTransform)
极坐标变换 (warpPolar 和 linearPolar)
将输入图像加权累加到累加图像中 (accumulateWeighted)
将输入图像的平方累加到累加图像中 (accumulateSquare)
将两个输入图像的乘积累加到累加图像中 (accumulateProduct)
将数据从主成分空间反投影回原空间 (backProject)
朴素贝叶斯分类器(NormalBayesClassifier)
棋盘格角点检测 (findChessboardCorners)
一、图像文件
图像文件 | |||
---|---|---|---|
imread | imwrite | imshow | VideoCapture |
读取图像文件 | 写入图像文件 | 显示图像 | 捕获视频 |
1. imread
:读取图像文件
作用:从文件读取图像并存储在一个矩阵(数组)中。
使用场景:当需要从磁盘加载图像进行处理或分析时。
样例代码:
import cv2
# 从文件读取图像
image = cv2.imread('path_to_image.jpg')
# 检查图像是否读取成功
if image is None:
print("图像读取失败")
else:
print("图像读取成功")
2. imwrite
:写入图像文件
作用:将图像矩阵(数组)写入到文件。
使用场景:当需要保存处理后的图像到磁盘时。
样例代码:
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 处理图像(例如,转换为灰度图像)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 将处理后的图像写入文件
cv2.imwrite('path_to_save_image.jpg', gray_image)
3. imshow
:显示图像
作用:在窗口中显示图像。
使用场景:当需要在屏幕上查看图像或处理结果时。
样例代码:
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 显示图像
cv2.imshow('Image', image)
# 等待按键按下
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
4. VideoCapture
:捕获视频
作用:从摄像头或视频文件中捕获视频流。
使用场景:当需要从摄像头获取实时视频流或从文件中读取视频进行处理时。
样例代码:
import cv2
# 打开摄像头(参数0表示第一个摄像头)
cap = cv2.VideoCapture(0)
# 检查摄像头是否打开成功
if not cap.isOpened():
print("无法打开摄像头")
else:
while True:
# 逐帧捕获
ret, frame = cap.read()
# 如果读取成功
if ret:
# 显示帧
cv2.imshow('Video', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
二、创建Mat
在OpenCV中,Mat
对象是一个强大的矩阵类型,用于表示图像和矩阵数据。下面是一些常用的构造函数和方法,用于创建和操作Mat
对象。
创建Mat的构造函数 | ||
zeros | ones | eye |
创建一个所有元素为零的矩阵 | 创建一个所有元素为一的矩阵 | 创建一个单位矩阵(对角线元素为一,其他元素为零) |
操作函数 | ||
colRange | rowRange | Range |
获取指定列范围的子矩阵 | 获取指定行范围的子矩阵 | 表示一个范围 |
1、创建Mat
对象
创建一个所有元素为零的矩阵
import cv2
import numpy as np
# 创建一个3x3的零矩阵
zero_matrix = np.zeros((3, 3), dtype=np.uint8)
print("Zero Matrix:\n", zero_matrix)
创建一个所有元素为一的矩阵
# 创建一个3x3的全一矩阵
one_matrix = np.ones((3, 3), dtype=np.uint8)
print("One Matrix:\n", one_matrix)
创建一个单位矩阵
# 创建一个3x3的单位矩阵
eye_matrix = np.eye(3, dtype=np.uint8)
print("Eye Matrix:\n", eye_matrix)
使用OpenCV中的函数和方法来创建和操作Mat
对象。可以根据需要组合这些方法来实现复杂的图像和矩阵操作任务。
2、操作Mat
对象
获取指定列范围的子矩阵
# 创建一个4x4的随机矩阵
matrix = np.random.randint(0, 256, (4, 4), dtype=np.uint8)
print("Original Matrix:\n", matrix)
# 获取第1到第3列(不包括第3列)的子矩阵
col_sub_matrix = matrix[:, 1:3]
print("Column Range Matrix:\n", col_sub_matrix)
获取指定行范围的子矩阵
# 获取第1到第3行(不包括第3行)的子矩阵
row_sub_matrix = matrix[1:3, :]
print("Row Range Matrix:\n", row_sub_matrix)
表示一个范围(在此例中用于创建子矩阵)
# 表示从第1到第3列(不包括第3列)的范围
col_range = slice(1, 3)
print("Column Range:\n", matrix[:, col_range])
# 表示从第1到第3行(不包括第3行)的范围
row_range = slice(1, 3)
print("Row Range:\n", matrix[row_range, :])
三、矩阵算术运算
在OpenCV中,Mat
对象支持基本的算术运算,这些运算可以用来对矩阵进行加法、减法、乘法和除法操作。下面分别介绍这些操作符的重载及其使用示例。
矩阵算术运算 | |||
+ (加法) |
- (减法) |
* (乘法) |
/ (除法) |
对两个矩阵进行元素逐个相加 | 对两个矩阵进行元素逐个相减 | 对两个矩阵进行元素逐个相乘 | 对两个矩阵进行元素逐个相除 |
矩阵加法
import cv2
import numpy as np
# 创建两个矩阵
matrix1 = np.array([[1, 2], [3, 4]], dtype=np.uint8)
matrix2 = np.array([[5, 6], [7, 8]], dtype=np.uint8)
# 矩阵加法
result_add = cv2.add(matrix1, matrix2)
print("Addition Result:\n", result_add)
矩阵减法
# 矩阵减法
result_sub = cv2.subtract(matrix1, matrix2)
print("Subtraction Result:\n", result_sub)
矩阵乘法
# 矩阵乘法(逐元素相乘)
result_mul = cv2.multiply(matrix1, matrix2)
print("Multiplication Result:\n", result_mul)
矩阵除法
# 矩阵除法(逐元素相除)
result_div = cv2.divide(matrix1, matrix2)
print("Division Result:\n", result_div)
通过这些示例代码,可以看到如何使用OpenCV中的操作符重载来对Mat
对象进行基本的算术运算。这些运算在图像处理和矩阵计算中非常常用,可以用于各种图像增强、滤波和特征提取任务。
四、数学运算
在OpenCV中,Mat
对象提供了丰富的数学运算功能,可以方便地对矩阵进行各种统计和算术运算。下面介绍一些常用的数学运算函数及其使用示例。
数学运算 | ||
mean | meanStdDev | sum |
计算矩阵的均值 | 计算矩阵的均值和标准差 | 计算矩阵元素的和 |
minMaxLoc | countNonZero | norm |
找到矩阵中的最小值和最大值及其位置 | 计算矩阵中非零元素的个数 | 计算矩阵的范数(如L2范数) |
计算均值 (mean
)
import cv2
import numpy as np
# 创建一个矩阵
matrix = np.array([[1, 2], [3, 4]], dtype=np.uint8)
# 计算矩阵的均值
mean_val = cv2.mean(matrix)
print("Mean Value:", mean_val)
计算均值和标准差 (meanStdDev
)
# 计算矩阵的均值和标准差
mean_val, stddev_val = cv2.meanStdDev(matrix)
print("Mean Value:", mean_val)
print("Standard Deviation:", stddev_val)
计算元素和 (sum
)
# 计算矩阵元素的和
sum_val = cv2.sumElems(matrix)
print("Sum of Elements:", sum_val)
找到最小值和最大值及其位置 (minMaxLoc
)
# 找到矩阵中的最小值和最大值及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(matrix)
print("Minimum Value:", min_val, "at", min_loc)
print("Maximum Value:", max_val, "at", max_loc)
计算非零元素的个数 (countNonZero
)
# 计算矩阵中非零元素的个数
nonzero_count = cv2.countNonZero(matrix)
print("Number of Non-Zero Elements:", nonzero_count)
计算矩阵的范数 (norm
)
# 计算矩阵的L2范数
norm_val = cv2.norm(matrix, cv2.NORM_L2)
print("L2 Norm of the Matrix:", norm_val)
通过这些示例代码,可以了解如何使用OpenCV中的这些数学运算函数来对Mat
对象进行各种统计和算术运算。这些函数在图像处理、特征提取和数据分析中非常有用。
五、矩阵计算函数
在OpenCV中,Mat
对象提供了丰富的矩阵计算功能,这些功能可以用于图像处理、机器学习、计算机视觉等领域。下面是一些常用的矩阵计算函数及其使用示例。
矩阵计算函数 | ||||
normalize | transpose | invert | flip | rotate |
归一化矩阵 | 转置矩阵 | 求矩阵的逆 | 翻转矩阵 | 旋转矩阵 |
determinant | trace | eigen | calcCovarMatrix | solve |
求矩阵的行列式 | 求矩阵的迹 | 求矩阵的特征值和特征向量 | 计算协方差矩阵 | 求解线性方程组 |
solveCubic | solvePoly | SVDcompute | max | min |
求解三次方程 | 求解多项式方程 | 奇异值分解 | 求矩阵元素的最大值 | 求矩阵元素的最小值 |
compare | repeat | PSNR | cross | dot |
比较矩阵 | 重复矩阵 | 峰值信噪比 | 向量的叉乘 | 向量的点乘 |
归一化矩阵 (normalize
)
import cv2
import numpy as np
# 创建一个矩阵
matrix = np.array([[1, 2], [3, 4]], dtype=np.float32)
# 归一化矩阵
normalized_matrix = cv2.normalize(matrix, None, 0, 1, cv2.NORM_MINMAX)
print("Normalized Matrix:\n", normalized_matrix)
转置矩阵 (transpose
)
# 转置矩阵
transposed_matrix = cv2.transpose(matrix)
print("Transposed Matrix:\n", transposed_matrix)
求矩阵的逆 (invert
)
# 创建一个可逆矩阵
invertible_matrix = np.array([[1, 2], [3, 4]], dtype=np.float32)
# 求矩阵的逆
inverse_matrix = cv2.invert(invertible_matrix)[1]
print("Inverse Matrix:\n", inverse_matrix)
翻转矩阵 (flip
)
# 翻转矩阵(沿Y轴翻转)
flipped_matrix = cv2.flip(matrix, 1)
print("Flipped Matrix:\n", flipped_matrix)
旋转矩阵 (rotate
)
# 翻转矩阵(沿Y轴翻转)
flipped_matrix = cv2.flip(matrix, 1)
print("Flipped Matrix:\n", flipped_matrix)
求矩阵的行列式 (determinant
)
# 求矩阵的行列式
determinant_val = cv2.determinant(invertible_matrix)
print("Determinant Value:", determinant_val)
求矩阵的迹 (trace
)
# 求矩阵的迹
trace_val = cv2.trace(matrix)[0]
print("Trace Value:", trace_val)
求矩阵的特征值和特征向量 (eigen
)
# 求矩阵的特征值和特征向量
eig_vals, eig_vecs = cv2.eigen(invertible_matrix)
print("Eigenvalues:\n", eig_vals)
print("Eigenvectors:\n", eig_vecs)
这些示例展示了如何使用OpenCV中的矩阵计算函数来处理Mat
对象。根据具体的应用需求,可以组合这些函数来实现复杂的矩阵运算和图像处理任务。
六、代数运算
在OpenCV中,代数运算函数用于对矩阵进行基本的代数运算。这些函数可以方便地实现加法、减法、乘法、除法等操作。下面介绍这些代数运算函数及其使用示例。
代数运算函数 | |||
add | subtract | multiply | divide |
矩阵加法 | 矩阵减法 | 矩阵乘法(逐元素相乘) | 矩阵除法(逐元素相除) |
absdiff | scaleAdd | addWeighted | |
计算两个矩阵的绝对差 | 按比例放大并相加 | 按权重相加 |
矩阵加法 (add
)
import cv2
import numpy as np
# 创建两个矩阵
matrix1 = np.array([[1, 2], [3, 4]], dtype=np.uint8)
matrix2 = np.array([[5, 6], [7, 8]], dtype=np.uint8)
# 矩阵加法
result_add = cv2.add(matrix1, matrix2)
print("Addition Result:\n", result_add)
矩阵减法 (subtract
)
import cv2
import numpy as np
# 创建两个矩阵
matrix1 = np.array([[1, 2], [3, 4]], dtype=np.uint8)
matrix2 = np.array([[5, 6], [7, 8]], dtype=np.uint8)
# 矩阵加法
result_add = cv2.add(matrix1, matrix2)
print("Addition Result:\n", result_add)
矩阵乘法 (multiply
)
# 矩阵乘法(逐元素相乘)
result_mul = cv2.multiply(matrix1, matrix2)
print("Multiplication Result:\n", result_mul)
矩阵除法 (divide
)
# 矩阵除法(逐元素相除)
result_div = cv2.divide(matrix1, matrix2)
print("Division Result:\n", result_div)
计算绝对差 (absdiff
)
# 计算两个矩阵的绝对差
result_absdiff = cv2.absdiff(matrix1, matrix2)
print("Absolute Difference Result:\n", result_absdiff)
按比例放大并相加 (scaleAdd
)
# 按比例放大并相加
scale = 2.5
result_scaleAdd = cv2.scaleAdd(matrix1, scale, matrix2)
print("Scale Add Result:\n", result_scaleAdd)
按权重相加 (addWeighted
)
# 按权重相加
alpha = 0.7
beta = 0.3
gamma = 0 # 可选偏移量
result_addWeighted = cv2.addWeighted(matrix1, alpha, matrix2, beta, gamma)
print("Weighted Addition Result:\n", result_addWeighted)
这些示例展示了如何使用OpenCV中的代数运算函数来对Mat
对象进行各种基本的代数运算。根据具体的应用需求,可以组合这些函数来实现复杂的图像处理和矩阵计算任务。
七、逻辑运算
在OpenCV中,逻辑运算函数用于对图像或矩阵进行像素级的逻辑操作。这些操作包括与(AND)、或(OR)、非(NOT)、异或(XOR)等。下面是这些逻辑运算函数的介绍及其使用示例。
逻辑运算函数 | |||
bitwise_and | bitwise_or | bitwise_not | bitwise_xor |
对两个矩阵进行按位与操作 | 对两个矩阵进行按位或操作 | 对矩阵进行按位取反操作 | 对两个矩阵进行按位异或操作 |
按位与操作 (bitwise_and
)
import cv2
import numpy as np
# 创建两个矩阵
matrix1 = np.array([[1, 2], [3, 4]], dtype=np.uint8)
matrix2 = np.array([[5, 6], [7, 8]], dtype=np.uint8)
# 按位与操作
result_and = cv2.bitwise_and(matrix1, matrix2)
print("Bitwise AND Result:\n", result_and)
按位或操作 (bitwise_or
)
# 按位或操作
result_or = cv2.bitwise_or(matrix1, matrix2)
print("Bitwise OR Result:\n", result_or)
按位取反操作 (bitwise_not
)
# 按位取反操作
result_not = cv2.bitwise_not(matrix1)
print("Bitwise NOT Result:\n", result_not)
按位异或操作 (bitwise_xor
)
# 按位异或操作
result_xor = cv2.bitwise_xor(matrix1, matrix2)
print("Bitwise XOR Result:\n", result_xor)
这些示例展示了如何使用OpenCV中的逻辑运算函数来对Mat
对象进行各种按位逻辑操作。这些操作在图像处理和计算机视觉中非常有用,特别是在掩模操作、图像合成和图像增强等应用中。根据具体的需求,可以灵活组合这些函数来实现复杂的图像处理任务。
八、图像拼接
在OpenCV中,图像拼接是指将多幅图像合并成一幅图像的过程。OpenCV提供了几种常用的函数和类来实现图像拼接。下面介绍这些拼接相关的函数及其使用示例。
图像拼接函数 | ||
hconcat | vconcat | Stitcher |
水平拼接图像 | 垂直拼接图像 | 全景图像拼接类 |
水平拼接图像 (hconcat
)
import cv2
import numpy as np
# 创建两个示例图像
image1 = np.full((100, 200, 3), 255, dtype=np.uint8) # 白色图像
image2 = np.full((100, 200, 3), 0, dtype=np.uint8) # 黑色图像
# 水平拼接图像
result_hconcat = cv2.hconcat([image1, image2])
cv2.imshow('Horizontal Concatenation', result_hconcat)
cv2.waitKey(0)
cv2.destroyAllWindows()
垂直拼接图像 (vconcat
)
# 垂直拼接图像
result_vconcat = cv2.vconcat([image1, image2])
cv2.imshow('Vertical Concatenation', result_vconcat)
cv2.waitKey(0)
cv2.destroyAllWindows()
全景图像拼接 (Stitcher
)
# 读取待拼接的图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')
# 创建Stitcher对象并进行拼接
stitcher = cv2.Stitcher_create()
status, stitched = stitcher.stitch([image1, image2])
if status == cv2.Stitcher_OK:
cv2.imshow('Stitched Image', stitched)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("拼接失败")
这些示例展示了如何使用OpenCV中的拼接函数来实现图像的水平拼接、垂直拼接以及全景图像拼接。这些函数和类在图像处理、计算机视觉以及图像分析中非常有用,可以根据具体需求灵活应用。
九、颜色通道及数据格式
在OpenCV中,颜色通道及数据格式的转换和操作是图像处理的重要部分。下面介绍这些相关的函数及其使用示例。
颜色通道及数据格式 | |||
cvtColor | convertTo | split | merge |
转换图像的颜色空间 | 转换图像的数据类型 | 分离图像的颜色通道 | 合并图像的颜色通道 |
extractChannel | insertChannel | applyColorMap | |
提取单个颜色通道 | 插入单个颜色通道 | 应用颜色映射 |
转换图像的颜色空间 (cvtColor
)
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
转换图像的数据类型 (convertTo
)
# 转换数据类型为float32
float_image = np.float32(image)
converted_image = float_image / 255.0
cv2.imshow('Converted Image', converted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
分离和合并颜色通道 (split
和 merge
)
# 分离颜色通道
b, g, r = cv2.split(image)
# 合并颜色通道
merged_image = cv2.merge([b, g, r])
cv2.imshow('Merged Image', merged_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
提取和插入颜色通道 (extractChannel
和 insertChannel
)
# 提取蓝色通道
blue_channel = cv2.extractChannel(image, 0)
cv2.imshow('Blue Channel', blue_channel)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 插入通道
new_image = cv2.insertChannel(blue_channel, image, 1)
cv2.imshow('Image with Inserted Channel', new_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
应用颜色映射 (applyColorMap
)
# 应用颜色映射
color_mapped_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_JET)
cv2.imshow('Color Mapped Image', color_mapped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这些示例展示了如何使用OpenCV中的函数来处理图像的颜色通道和数据格式。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。
十、图像复制函数
在OpenCV中,图像复制是基本的操作,可以通过 clone
和 copyTo
函数来实现。下面介绍这些函数及其使用示例。
图像复制函数 | |
clone | copyTo |
创建一个图像的深拷贝 | 将图像数据复制到另一个矩阵,可以选择性地使用掩码 |
使用 clone
进行深拷贝
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 使用 clone 进行深拷贝
cloned_image = image.clone()
# 显示原图和拷贝图
cv2.imshow('Original Image', image)
cv2.imshow('Cloned Image', cloned_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用 copyTo
进行复制
# 创建一个与原图像相同大小的空图像
copy_image = np.zeros_like(image)
# 直接复制图像
image.copyTo(copy_image)
# 显示原图和拷贝图
cv2.imshow('Original Image', image)
cv2.imshow('Copy Image', copy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用 copyTo
和掩码进行复制
# 创建一个掩码
mask = np.zeros(image.shape[:2], dtype=np.uint8)
mask[50:150, 50:150] = 255 # 在掩码上定义一个区域
# 复制图像中的特定区域
masked_copy = np.zeros_like(image)
image.copyTo(masked_copy, mask=mask)
# 显示原图、掩码和掩码复制图
cv2.imshow('Original Image', image)
cv2.imshow('Mask', mask)
cv2.imshow('Masked Copy Image', masked_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
这些示例展示了如何使用OpenCV中的 clone
和 copyTo
函数来复制图像。根据具体的需求,可以选择直接复制整个图像或使用掩码复制特定区域的图像数据。这些操作在图像处理、图像增强和计算机视觉应用中非常有用。
十一、图像变化与增强
在OpenCV中,图像变换与增强是图像处理的重要组成部分。下面介绍一些常用的图像变换与增强函数及其使用示例。
图像变换与增强函数 | ||||
convertScaleAbs | log | exp | pow | sqrt |
缩放、计算绝对值并转换为8位 | 计算每个元素的自然对数 | 计算每个元素的指数 | 计算每个元素的幂 | 计算每个元素的平方根 |
equalizeHist | CLAHE | detailEnhance | illuminationChange | |
直方图均衡化 | 自适应直方图均衡化(对比度受限的自适应直方图均衡化) | 细节增强 | 改变光照条件 |
缩放、计算绝对值并转换为8位 (convertScaleAbs
)
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)
# 缩放、计算绝对值并转换为8位
scaled_image = cv2.convertScaleAbs(image, alpha=1.5, beta=0)
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
计算自然对数 (log
)
# 计算每个元素的自然对数
log_image = cv2.log(np.float32(image) + 1) # 加1防止对数的负无穷
cv2.imshow('Log Image', cv2.convertScaleAbs(log_image))
cv2.waitKey(0)
cv2.destroyAllWindows()
计算指数 (exp
)
# 计算每个元素的指数
exp_image = cv2.exp(np.float32(image))
cv2.imshow('Exp Image', cv2.convertScaleAbs(exp_image))
cv2.waitKey(0)
cv2.destroyAllWindows()
计算幂 (pow
)
# 计算每个元素的幂
pow_image = cv2.pow(np.float32(image), 2)
cv2.imshow('Pow Image', cv2.convertScaleAbs(pow_image))
cv2.waitKey(0)
cv2.destroyAllWindows()
计算平方根 (sqrt
)
# 计算每个元素的平方根
sqrt_image = cv2.sqrt(np.float32(image))
cv2.imshow('Sqrt Image', cv2.convertScaleAbs(sqrt_image))
cv2.waitKey(0)
cv2.destroyAllWindows()
直方图均衡化 (equalizeHist
)
# 直方图均衡化
equalized_image = cv2.equalizeHist(image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
自适应直方图均衡化 (CLAHE
)
# 创建CLAHE对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 应用CLAHE
clahe_image = clahe.apply(image)
cv2.imshow('CLAHE Image', clahe_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
细节增强 (detailEnhance
)
# 细节增强
detail_image = cv2.detailEnhance(image)
cv2.imshow('Detail Enhanced Image', detail_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
改变光照条件 (illuminationChange
)
# 改变光照条件
illum_image = cv2.illuminationChange(image, mask=np.ones(image.shape, dtype=np.uint8), alpha=0.5, beta=2)
cv2.imshow('Illumination Changed Image', illum_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这些示例展示了如何使用OpenCV中的图像变换与增强函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理和增强任务。
十二、图像平滑滤波
在OpenCV中,图像平滑滤波(或称为图像去噪)是一种非常常见的操作,通常用于去除图像中的噪声,使图像变得更加平滑。OpenCV提供了多种滤波函数,下面介绍这些滤波函数及其使用示例。
图像平滑滤波函数 | ||||
blur | boxFilter | sqBoxFilter | medianBlur | GaussianBlur |
均值滤波 | 方框滤波 | 平方方框滤波 | 中值滤波 | 高斯滤波 |
bilateralFilter | filter2D | sepFilter2D | edgePreservingFilter | fastNlMeansDenoising |
双边滤波 | 自定义滤波器 | 分离滤波器 | 边缘保留滤波 | 快速非局部均值去噪 |
fastNlMeansDenoisingColored | textureFlattening | getGaussianKernel | ||
彩色图像的快速非局部均值去噪 | 纹理平滑 | 获取高斯核 |
均值滤波 (blur
)
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 均值滤波
blurred_image = cv2.blur(image, (5, 5))
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
方框滤波 (boxFilter
)
# 方框滤波
box_filtered_image = cv2.boxFilter(image, -1, (5, 5))
cv2.imshow('Box Filtered Image', box_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波 (medianBlur
)
# 中值滤波
median_blurred_image = cv2.medianBlur(image, 5)
cv2.imshow('Median Blurred Image', median_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯滤波 (GaussianBlur
)
# 高斯滤波
gaussian_blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
cv2.imshow('Gaussian Blurred Image', gaussian_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
双边滤波 (bilateralFilter
)
# 双边滤波
bilateral_filtered_image = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
自定义滤波器 (filter2D
)
# 自定义滤波器
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
custom_filtered_image = cv2.filter2D(image, -1, kernel)
cv2.imshow('Custom Filtered Image', custom_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
边缘保留滤波 (edgePreservingFilter
)
# 边缘保留滤波
edge_preserved_image = cv2.edgePreservingFilter(image, flags=1, sigma_s=60, sigma_r=0.4)
cv2.imshow('Edge Preserved Image', edge_preserved_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
快速非局部均值去噪 (fastNlMeansDenoising
)
# 快速非局部均值去噪
denoised_image = cv2.fastNlMeansDenoising(image, None, 30, 7, 21)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
彩色图像的快速非局部均值去噪 (fastNlMeansDenoisingColored
)
# 彩色图像的快速非局部均值去噪
denoised_colored_image = cv2.fastNlMeansDenoisingColored(image, None, 30, 30, 7, 21)
cv2.imshow('Denoised Colored Image', denoised_colored_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
获取高斯核 (getGaussianKernel
)
# 获取高斯核
gaussian_kernel = cv2.getGaussianKernel(5, 1.5)
print("Gaussian Kernel:\n", gaussian_kernel)
这些示例展示了如何使用OpenCV中的各种平滑滤波函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像平滑和去噪任务。
十三、锐化与边缘检测
在OpenCV中,锐化与边缘检测是图像处理的重要任务之一,用于检测图像中的边缘和细节。下面介绍一些常用的锐化与边缘检测函数及其使用示例。
锐化与边缘检测函数 | |||
Sobel | Scharr | Laplacian | spatialGradient |
Sobel算子,用于计算图像的梯度 | Scharr算子,Sobel算子的增强版本 |