使用 openCV进行图像处理

使用 openCV进行图像处理,又名:学习计算机视觉理论,做 demo(第3 天)

目录

2.1 图像模糊

2.1.1 均值滤波2.1.2 中值滤波2.1.3 高斯滤波2.1.4 案例实现 2.2 图像锐化

2.2.1 图像锐化简介2.2.2 案例实现 3.1 OpenCV绘图

3.1.1 使用OpenCV绘制各种图形3.1.2 案例实现 3.2 图像的几何变换

3.2.1 几何变换操作3.2.2 案例实现 案例练习

2.1 图像模糊

2.1.1 均值滤波

概念:均值滤波是一种图像模糊技术,它通过取像素周围邻域的平均值来减小图像中的噪声和细节,从而产生平滑的效果。在均值滤波中,将一个像素周围的邻域的灰度值取平均,然后用这个平均值来替代原像素的值。

使用场景:均值滤波常用于去除图像中的高频噪声,例如盐噪声和椒噪声。它也可以用于平滑图像以减小细节,例如在图像压缩中。

用例代码:

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)

2.1.2 中值滤波

概念:中值滤波是一种非线性滤波方法,它通过取像素周围邻域的中值来减小图像中的噪声,特别适用于去除椒盐噪声。中值滤波不会改变图像中的边缘信息。

使用场景:中值滤波通常用于去除图像中的椒盐噪声或脉冲噪声,因为它能够有效地保留图像中的细节。

用例代码:

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)

2.1.3 高斯滤波

概念:高斯滤波是一种线性滤波技术,它使用高斯函数来加权平均像素值,以减小图像中的噪声并实现平滑效果。高斯滤波在处理噪声时,通常能够保留更多的图像细节。

使用场景:高斯滤波常用于图像去噪、平滑和边缘保留。它适用于大多数图像处理任务,特别是当噪声的分布近似于高斯分布时。

用例代码:

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)

2.1.4 案例实现

在这一部分,我们将结合上述三种图像模糊方法来实现一个图像去噪的示例。假设我们有一张带有椒盐噪声的图像,我们可以先使用中值滤波去除椒盐噪声,然后再使用高斯滤波平滑图像。

用例代码:

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)

2.2 图像锐化

2.2.1 图像锐化简介

概念:图像锐化是一种增强图像细节和边缘的图像处理技术。它通过增加像素值的差异来提高图像的对比度,使图像中的边缘和细节更加突出。

2.2.2 案例实现

在这一部分,我们将实现一个图像锐化的示例,使用卷积核(例如拉普拉斯算子)来增强图像的边缘。

用例代码:

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)

算法解释:

在算法层面对图像模糊和图像锐化的方法进行解释:

2.1 图像模糊

2.1.1 均值滤波算法解释

均值滤波的算法非常简单,它通过取像素周围一个固定大小的邻域内像素值的平均值来模糊图像。具体步骤如下:

选取一个固定大小的滤波核(通常是一个矩形或正方形的窗口),核的大小由用户指定。将滤波核的中心对准图像中的每个像素点。对于每个像素点,将滤波核覆盖的区域内的像素值求平均,并用这个平均值来替代原始像素的值。重复步骤2和步骤3,直到对图像的所有像素都进行了处理。

均值滤波对图像进行平滑处理,减小了噪声和细节,适用于去除盐噪声和椒噪声等高频噪声。

2.1.2 中值滤波算法解释

中值滤波是一种非线性滤波方法,它的算法如下:

选取一个固定大小的滤波核(通常是一个正方形窗口),核的大小由用户指定。将滤波核的中心对准图像中的每个像素点。对于每个像素点,将滤波核覆盖的区域内的像素值排序,然后取中间值(中位数)作为该像素的新值。重复步骤2和步骤3,直到对图像的所有像素都进行了处理。

中值滤波特别适用于去除椒盐噪声,因为中位数不受极端值的干扰,能够有效地保留图像细节。

2.1.3 高斯滤波算法解释

高斯滤波使用高斯函数来加权平均像素值,以实现图像的模糊。其算法如下:

选取一个固定大小的滤波核(通常是一个正方形窗口),核的大小和一个标准差参数(sigma)由用户指定。将滤波核的中心对准图像中的每个像素点。对于每个像素点,将滤波核覆盖的区域内的像素值按照高斯函数的权重进行加权平均,得到新的像素值。重复步骤2和步骤3,直到对图像的所有像素都进行了处理。

高斯滤波可以用于图像去噪和平滑,它在处理噪声时通常能够保留更多的图像细节。

2.2 图像锐化

2.2.1 图像锐化算法解释

图像锐化是一种增强图像细节和边缘的图像处理技术。其中一种常见的算法是使用拉普拉斯算子进行卷积操作,其算法如下:

创建一个特定的卷积核,通常是一个3x3的矩阵,其中心值为-4,周围的8个值为1。将这个卷积核对准图像中的每个像素点。对于每个像素点,将卷积核覆盖的区域内的像素值与卷积核的对应元素相乘,并将所有结果相加得到新的像素值。重复步骤2和步骤3,直到对图像的所有像素都进行了处理。

拉普拉斯算子的卷积操作会增加像素值的差异,从而提高了图像的对比度,使边缘和细节更加突出。

总之,图像模糊方法通过修改像素值以减小图像中的噪声和细节,而图像锐化方法则通过增加像素值的差异来提高图像的对比度,从而增强边缘和细节。每种方法都有其适用的场景和算法特点。

总结

我们学习了图像处理中的图像模糊和图像锐化技术。图像模糊包括均值滤波、中值滤波和高斯滤波,它们分别适用于不同的噪声去除和平滑需求。图像锐化用于增强图像的边缘和细节。通过实例代码,我们展示了如何应用这些技术来处理图像。

3.1 OpenCV绘图

3.1.1 使用OpenCV绘制各种图形

概念: 使用OpenCV绘制各种图形是一种图像处理技术,它允许您在图像上绘制不同类型的几何图形,如线条、矩形、圆形、多边形等。这些绘图功能可用于在图像上添加标记、边框、区域等信息。

使用场景: 绘制各种图形常用于图像处理和计算机视觉应用中,例如:

在物体检测或跟踪中标记物体的位置和边界框。在图像分类中为不同类别的图像添加标签。在图像分析中标记感兴趣的区域或特征点。

算法解释: OpenCV提供了一组绘图函数,用于绘制各种图形。这些函数通常接受图像、要绘制的图形类型、起始坐标、颜色、线条宽度等参数,并在图像上绘制指定的图形。例如,使用cv2.line()函数可以绘制直线,使用cv2.rectangle()函数可以绘制矩形,使用cv2.circle()函数可以绘制圆形等。

3.1.2 案例实现

在这一部分,我们将结合前面学到的绘图技巧来实现一个案例,例如在一张图像中绘制多个不同形状的对象。以下是一个示例代码:

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)

3.2 图像的几何变换

3.2.1 几何变换操作

概念: 图像的几何变换操作是一种图像处理技术,它允许您对图像进行平移、旋转、缩放、翻转等操作,以改变图像的大小、位置和方向。

使用场景: 几何变换常用于图像处理和计算机视觉中的以下情况:

图像配准:将不同角度或位置的图像对齐,以便进行特征匹配或图像融合。图像增强:改变图像的大小、方向或形状,以突出感兴趣的特征。图像校正:校正图像中的透视畸变或投影变换,使对象呈现真实的几何形状。

算法解释: 几何变换操作通常涉及到矩阵变换,其中包括平移、旋转、缩放和翻转等。这些变换可以通过矩阵乘法来应用到图像的像素坐标上,从而实现图像的几何变换。在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)

以上代码演示了平移、旋转和缩放操作,可以根据具体需求组合使用不同的几何变换来实现图像的变换和增强。

案例练习:

数据可以从:

Kaggle:Kaggle提供了各种医学图像数据集,您可以在这里找到不同类型的X射线图像、MRI图像等。NIH Clinical Center:美国国立卫生研究院(NIH)提供了一些公共的医学图像数据集,适用于研究和测试。Radiological Society of North America (RSNA):RSNA也提供了一些医学图像数据集,尤其是关于放射学的图像。

案例:肺部X射线图像处理

要求:对它进行标记病变位置,突出病变图像

求解思路:

去噪处理: 由于X射线图像常常受到噪声的影响,首先需要使用图像模糊技术,如高斯滤波,来减小噪声并平滑图像。边缘检测: 在图像中检测肺部的轮廓和可能的病变区域,您可以使用边缘检测技术,如Canny边缘检测。图像增强: 对于一些特定的区域或病变,您可能希望突出显示,以便医生更容易诊断。这可以通过增强图像的部分区域来实现,例如使用对比度增强技术。标记病变: 如果发现了可能的病变区域,您可以使用图像绘制技术,在图像上标记出这些区域,以供医生进一步研究。几何变换: 在某些情况下,您可能需要调整图像的大小、位置或方向,以便更好地显示特定区域。

示例:

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)用于处理数组和矩阵。

读取肺部X射线图像:

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是高斯分布的标准差,用于调整滤波效果。

边缘检测(Canny边缘检测):

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射线图像的一般步骤,包括去噪、边缘检测、图像增强、图像绘制等。实际应用中,您可以根据具体需求和医学专家的建议进行更多的图像处理和分析。

查阅 API:

要查阅OpenCV的API文档,您可以参考以下步骤:

官方网站: OpenCV的官方网站提供了最全面的文档和资源。您可以访问OpenCV官方网站:OpenCV官方网站,然后点击 “Documentation” 或 “Docs” 链接,以查看API文档和其他文档资源。官方文档: 在OpenCV官方文档页面,您可以找到各种版本的文档,包括C++和Python等不同语言的文档。选择您使用的编程语言版本,然后浏览各种模块和函数的文档。在线搜索引擎: 您可以使用在线搜索引擎,如Google,来查找特定的OpenCV函数或模块。通常,搜索 “OpenCV” 加上您感兴趣的函数或主题的关键词,例如 “OpenCV cv2.imread documentation”,将会带您直接到相关的API文档页面。本地文档: 如果您已经在本地安装了OpenCV库,您可以在本地查阅API文档。在OpenCV的安装目录下,通常会有一个名为 “docs” 或 “doc” 的文件夹,其中包含了各种格式的文档,包括HTML和PDF格式。您可以打开这些文档并浏览API参考。编辑器中: 例如 pycharm, 是最推荐的方式, 编辑器碰到这个函数的时候会弹出相关信息, 虽然是英文,但是需要你耐着性子看完,这个练习好,比较有用。

在API文档中,您将找到关于OpenCV库的详细信息,包括函数的参数、返回值、用法示例和示例代码。这些文档对于了解如何使用OpenCV的不同功能非常有帮助。

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: