使用 openCV进行图像处理,又名:学习计算机视觉理论,做 demo(第3 天)
概念:均值滤波是一种图像模糊技术,它通过取像素周围邻域的平均值来减小图像中的噪声和细节,从而产生平滑的效果。在均值滤波中,将一个像素周围的邻域的灰度值取平均,然后用这个平均值来替代原像素的值。
使用场景:均值滤波常用于去除图像中的高频噪声,例如盐噪声和椒噪声。它也可以用于平滑图像以减小细节,例如在图像压缩中。
用例代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('input.jpg')
# 使用均值滤波
kernel_size = (5, 5)
blurred_image = cv2.blur(image, kernel_size)
# 保存结果
cv2.imwrite('output_blurred.jpg', blurred_image)
概念:中值滤波是一种非线性滤波方法,它通过取像素周围邻域的中值来减小图像中的噪声,特别适用于去除椒盐噪声。中值滤波不会改变图像中的边缘信息。
使用场景:中值滤波通常用于去除图像中的椒盐噪声或脉冲噪声,因为它能够有效地保留图像中的细节。
用例代码:
import cv2
# 读取图像
image = cv2.imread('input.jpg')
# 使用中值滤波
kernel_size = 3
median_blurred_image = cv2.medianBlur(image, kernel_size)
# 保存结果
cv2.imwrite('output_median_blurred.jpg', median_blurred_image)
概念:高斯滤波是一种线性滤波技术,它使用高斯函数来加权平均像素值,以减小图像中的噪声并实现平滑效果。高斯滤波在处理噪声时,通常能够保留更多的图像细节。
使用场景:高斯滤波常用于图像去噪、平滑和边缘保留。它适用于大多数图像处理任务,特别是当噪声的分布近似于高斯分布时。
用例代码:
import cv2
# 读取图像
image = cv2.imread('input.jpg')
# 使用高斯滤波
kernel_size = (5, 5)
sigma = 1.0
gaussian_blurred_image = cv2.GaussianBlur(image, kernel_size, sigma)
# 保存结果
cv2.imwrite('output_gaussian_blurred.jpg', gaussian_blurred_image)
在这一部分,我们将结合上述三种图像模糊方法来实现一个图像去噪的示例。假设我们有一张带有椒盐噪声的图像,我们可以先使用中值滤波去除椒盐噪声,然后再使用高斯滤波平滑图像。
用例代码:
import cv2
# 读取图像
image = cv2.imread('input_noisy.jpg')
# 使用中值滤波去除椒盐噪声
kernel_size = 3
median_blurred_image = cv2.medianBlur(image, kernel_size)
# 使用高斯滤波平滑图像
kernel_size = (5, 5)
sigma = 1.0
final_blurred_image = cv2.GaussianBlur(median_blurred_image, kernel_size, sigma)
# 保存结果
cv2.imwrite('output_denoised.jpg', final_blurred_image)
概念:图像锐化是一种增强图像细节和边缘的图像处理技术。它通过增加像素值的差异来提高图像的对比度,使图像中的边缘和细节更加突出。
在这一部分,我们将实现一个图像锐化的示例,使用卷积核(例如拉普拉斯算子)来增强图像的边缘。
用例代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('input.jpg')
# 创建拉普拉斯卷积核
laplacian_kernel = np.array([[0, 1, 0],
[1, -4, 1],
[0, 1, 0]], dtype=np.float32)
# 使用卷积操作进行图像锐化
sharpened_image = cv2.filter2D(image, -1, laplacian_kernel)
# 保存结果
cv2.imwrite('output_sharpened.jpg', sharpened_image)
在算法层面对图像模糊和图像锐化的方法进行解释:
均值滤波的算法非常简单,它通过取像素周围一个固定大小的邻域内像素值的平均值来模糊图像。具体步骤如下:
均值滤波对图像进行平滑处理,减小了噪声和细节,适用于去除盐噪声和椒噪声等高频噪声。
中值滤波是一种非线性滤波方法,它的算法如下:
中值滤波特别适用于去除椒盐噪声,因为中位数不受极端值的干扰,能够有效地保留图像细节。
高斯滤波使用高斯函数来加权平均像素值,以实现图像的模糊。其算法如下:
高斯滤波可以用于图像去噪和平滑,它在处理噪声时通常能够保留更多的图像细节。
图像锐化是一种增强图像细节和边缘的图像处理技术。其中一种常见的算法是使用拉普拉斯算子进行卷积操作,其算法如下:
拉普拉斯算子的卷积操作会增加像素值的差异,从而提高了图像的对比度,使边缘和细节更加突出。
总之,图像模糊方法通过修改像素值以减小图像中的噪声和细节,而图像锐化方法则通过增加像素值的差异来提高图像的对比度,从而增强边缘和细节。每种方法都有其适用的场景和算法特点。
我们学习了图像处理中的图像模糊和图像锐化技术。图像模糊包括均值滤波、中值滤波和高斯滤波,它们分别适用于不同的噪声去除和平滑需求。图像锐化用于增强图像的边缘和细节。通过实例代码,我们展示了如何应用这些技术来处理图像。
概念: 使用OpenCV绘制各种图形是一种图像处理技术,它允许您在图像上绘制不同类型的几何图形,如线条、矩形、圆形、多边形等。这些绘图功能可用于在图像上添加标记、边框、区域等信息。
使用场景: 绘制各种图形常用于图像处理和计算机视觉应用中,例如:
算法解释: OpenCV提供了一组绘图函数,用于绘制各种图形。这些函数通常接受图像、要绘制的图形类型、起始坐标、颜色、线条宽度等参数,并在图像上绘制指定的图形。例如,使用cv2.line()
函数可以绘制直线,使用cv2.rectangle()
函数可以绘制矩形,使用cv2.circle()
函数可以绘制圆形等。
在这一部分,我们将结合前面学到的绘图技巧来实现一个案例,例如在一张图像中绘制多个不同形状的对象。以下是一个示例代码:
import cv2
import numpy as np
# 创建一张空白图像
image = np.zeros((400, 400, 3), dtype=np.uint8)
# 绘制一个绿色圆形
cv2.circle(image, (200, 150), 50, (0, 255, 0), -1)
# 绘制一个黄色矩形
cv2.rectangle(image, (100, 200), (300, 300), (0, 255, 255), -1)
# 绘制一个蓝色多边形
pts = np.array([[50, 350], [150, 250], [250, 350]], np.int32)
cv2.polylines(image, [pts], isClosed=True, color=(255, 0, 0), thickness=3)
# 保存结果
cv2.imwrite('output_draw_shapes_example.jpg', image)
概念: 图像的几何变换操作是一种图像处理技术,它允许您对图像进行平移、旋转、缩放、翻转等操作,以改变图像的大小、位置和方向。
使用场景: 几何变换常用于图像处理和计算机视觉中的以下情况:
算法解释: 几何变换操作通常涉及到矩阵变换,其中包括平移、旋转、缩放和翻转等。这些变换可以通过矩阵乘法来应用到图像的像素坐标上,从而实现图像的几何变换。在OpenCV中,常用的几何变换函数包括cv2.warpAffine()
和cv2.warpPerspective()
,它们可以用来实现平移、旋转、缩放和透视变换。
案例代码: 下面是一个示例代码,演示如何使用OpenCV对图像进行平移、旋转和缩放操作:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('input.jpg')
# 获取图像尺寸
height, width = image.shape[:2]
# 定义平移矩阵
tx, ty = 50, 30
translation_matrix = np.float32([[1, 0, tx],
[0, 1, ty]])
# 使用平移矩阵进行平移操作
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))
# 定义旋转矩阵
angle = 45
rotation_matrix = cv2.getRotationMatrix2D((width // 2, height // 2), angle, 1)
# 使用旋转矩阵进行旋转操作
rotated_image = cv2.warpAffine(translated_image, rotation_matrix, (width, height))
# 定义缩放矩阵
scale_factor = 1.5
scaling_matrix = np.float32([[scale_factor, 0, 0],
[0, scale_factor, 0]])
# 使用缩放矩阵进行缩放操作
scaled_image = cv2.warpAffine(rotated_image, scaling
_matrix, (width, height))
# 保存结果
cv2.imwrite('output_geometric_transformations.jpg', scaled_image)
以上代码演示了平移、旋转和缩放操作,可以根据具体需求组合使用不同的几何变换来实现图像的变换和增强。
数据可以从:
案例:肺部X射线图像处理
要求:对它进行标记病变位置,突出病变图像
示例:
import cv2
import numpy as np
# 1. 读取肺部X射线图像
image = cv2.imread('chest_xray.jpg')
# 2. 去噪处理:使用高斯滤波
kernel_size = (5, 5)
sigma = 1.0
blurred_image = cv2.GaussianBlur(image, kernel_size, sigma)
# 3. 边缘检测:使用Canny边缘检测
edges = cv2.Canny(blurred_image, threshold1=30, threshold2=70)
# 4. 图像增强:对比度增强
enhanced_image = cv2.convertScaleAbs(blurred_image, alpha=2.0, beta=0)
# 5. 标记病变:在边缘图上标记病变区域
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
cv2.drawContours(enhanced_image, [contour], -1, (0, 0, 255), 2)
# 6. 几何变换:例如,可以进行平移、旋转或缩放操作
# 7. 保存处理后的图像
cv2.imwrite('processed_chest_xray.jpg', enhanced_image)
代码解释(第一次就详细点,后续的我只用加注释的代码, 其他的你们需要查 API, 怎么查 API 我会贴在最后)
当您需要对一张肺部X射线图像进行处理时,通常需要执行一系列图像处理步骤。下面是对上述Python代码的解释,这个代码模拟了处理肺部X射线图像的过程:
import cv2
import numpy as np
在这里,我们导入了OpenCV(cv2)用于图像处理,以及NumPy(numpy)用于处理数组和矩阵。
image = cv2.imread('chest_xray.jpg')
这一行代码用于读取名为’chest_xray.jpg’的肺部X射线图像。
kernel_size = (5, 5)
sigma = 1.0
blurred_image = cv2.GaussianBlur(image, kernel_size, sigma)
通过高斯滤波,我们减小了图像的噪声并使其平滑化。kernel_size
定义了滤波核的大小,sigma
是高斯分布的标准差,用于调整滤波效果。
edges = cv2.Canny(blurred_image, threshold1=30, threshold2=70)
使用Canny边缘检测算法,我们检测了图像中的边缘,创建了一个二值图像,其中边缘以白色表示。
enhanced_image = cv2.convertScaleAbs(blurred_image, alpha=2.0, beta=0)
这里我们增强了图像的对比度,使得图像中的特征更加突出。alpha
参数控制对比度的倍数,beta
参数控制亮度偏移。
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
cv2.drawContours(enhanced_image, [contour], -1, (0, 0, 255), 2)
在这一步,我们找到了边缘图中的轮廓,并在原始图像上标记了这些轮廓,以便医生进一步研究。
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
这一行代码使用了OpenCV的 cv2.findContours()
函数来寻找图像中的轮廓。下面是每个参数的含义:
edges
:这是输入的二值化图像,通常是经过边缘检测后的图像,其中边缘以白色表示。cv2.RETR_EXTERNAL
:这是轮廓检索模式的参数。cv2.RETR_EXTERNAL
表示仅检测外部轮廓,即不包括内部的孔或洞。这在一般情况下用于找到图像中的主要轮廓。cv2.CHAIN_APPROX_SIMPLE
:这是轮廓近似方法的参数。cv2.CHAIN_APPROX_SIMPLE
表示对轮廓进行简化,只保留轮廓的端点信息,以节省内存空间。这在一般情况下足够用于轮廓绘制。函数的返回值是一个包含轮廓信息的列表 contours
,以及一个层次信息的列表,但在这里我们使用 _
表示我们不关心层次信息,因此将其忽略。 contours
列表中的每个元素都是一个包含轮廓点坐标的数组,您可以在后续的步骤中使用这些坐标来绘制或分析轮廓。
cv2.imwrite('processed_chest_xray.jpg', enhanced_image)
最后,我们保存处理后的图像为’processed_chest_xray.jpg’。
这个代码示例演示了处理肺部X射线图像的一般步骤,包括去噪、边缘检测、图像增强、图像绘制等。实际应用中,您可以根据具体需求和医学专家的建议进行更多的图像处理和分析。
要查阅OpenCV的API文档,您可以参考以下步骤:
在API文档中,您将找到关于OpenCV库的详细信息,包括函数的参数、返回值、用法示例和示例代码。这些文档对于了解如何使用OpenCV的不同功能非常有帮助。