当前位置: 首页 > article >正文

cv2库的使用及图像预处理02

目录

八,图像缩放

1. 图像缩放操作

2. 插值方法

(1)最邻近插值(cv2.INTER_NEAREST)

(2)双线性插值(cv2.INTER_LINEAR)

3. 显示缩放结果

4. 目标尺寸

5. 总结

九,线性灰度变化

1. 线性灰度变换函数 linear_trans

2. 图像处理与显示

3. 灰度变换操作

(1)灰度反转

(2)灰度拉伸

(3)灰度压缩

4. 显示结果

5. 总结

十,伽马变换

1. 直方图均衡化

OpenCV 的 cv2.equalizeHist

2. 代码解析

(1)读取图像并显示

(2)直方图均衡化

(3)显示原始图像的直方图

(4)显示均衡化图像的直方图

3. 显示结果

4. 对比分析

5. 总结

十一,直方图均衡化

1. 代码解析

(1)读取图像

(2)显示原始图像

(3)直方图均衡化

(4)显示原始图像的直方图

(5)显示均衡化图像的直方图

(6)显示结果

2. 运行结果

3. 直方图均衡化的原理

4. 总结

十二,分割阈值

1. 代码解析

(1)读取灰度图像

(2)简单阈值分割

(3)Otsu 阈值分割

(4)打印阈值

(5)显示结果

2. 运行结果

3. Otsu 方法的优势

4. 总结

十三,图像的腐蚀与膨胀

1.定义结构元素

2. 腐蚀操作

3. 膨胀操作

4. 总结

十四,图像的模糊处理

1. 中值模糊(Median Blur)

2. 均值模糊(Mean Blur)

3. 高斯模糊(Gaussian Blur)

4. 总结

十五,图像锐化

1. 锐化算子的定义

(1)锐化算子 1

(2)锐化算子 2

2. 锐化操作

3. 显示结果

4. 运行结果

5. 总结


前言

cv库-python第一篇的链接:
cv2库的使用及图像预处理01-CSDN博客

八,图像缩放

im = cv2.imread('lenna.png') 
im_RBG = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.title('original'),plt.imshow(im_RBG) 

# 获取图像尺寸
(h, w) = im_RBG.shape[:2] 

# 缩放的目标尺寸
dst_size = (2000,3000) 

# 最邻近插值 
method = cv2.INTER_NEAREST 

# 进行缩放 
resized = cv2.resize(im_RBG, dst_size, interpolation = method)
plt.subplot(2,2,2),plt.title('INTER_NEAREST'),plt.imshow(resized) 

# 缩放的目标尺寸
dst_size = (5000,5000) 

# 双线性插值 
method = cv2.INTER_LINEAR 

# 进行缩放 
resized_linear = cv2.resize(im_RBG, dst_size, interpolation = method) 
plt.subplot(2,2,3),plt.title('INTER_LINEAR'),plt.imshow(resized_linear)

使用 OpenCV 的 cv2.resize 函数对图像进行缩放操作,并对比了两种不同的插值方法:最邻近插值(INTER_NEAREST)双线性插值(INTER_LINEAR)

1. 图像缩放操作
resized = cv2.resize(im_RBG, dst_size, interpolation=method)

  • cv2.resize:用于对图像进行缩放操作。
    • im_RBG:输入图像。
    • dst_size:目标尺寸,格式为 (width, height)。
    • interpolation:插值方法,用于决定缩放时如何计算新像素值。
2. 插值方法
(1)最邻近插值(cv2.INTER_NEAREST)
method = cv2.INTER_NEAREST
resized = cv2.resize(im_RBG, dst_size, interpolation=method)

  • 特点
    • 最简单的插值方法,直接取最近的像素值。
    • 速度快,但缩放后的图像质量较差,可能有明显的锯齿感。
  • 适用场景
    • 对图像质量要求不高,但需要快速处理的场景。
(2)双线性插值(cv2.INTER_LINEAR)
method = cv2.INTER_LINEAR
resized_linear = cv2.resize(im_RBG, dst_size, interpolation=method)

  • 特点
    • 使用周围四个像素的线性组合来计算新像素值。
    • 缩放后的图像质量较好,但计算速度比最邻近插值慢。
  • 适用场景
    • 对图像质量有一定要求的场景,例如图像放大或缩小后需要保持较好的视觉效果。
3. 显示缩放结果
plt.subplot(2, 2, 2), plt.title('INTER_NEAREST'), plt.imshow(resized)
plt.subplot(2, 2, 3), plt.title('INTER_LINEAR'), plt.imshow(resized_linear)

  • 使用 Matplotlib 的 plt.subplot 和 plt.imshow 显示缩放后的图像。
  • 对比两种插值方法的效果:
    • INTER_NEAREST:图像可能有明显的锯齿感,尤其是在放大时。
    • INTER_LINEAR:图像质量更好,过渡更平滑。
4. 目标尺寸
  • 第一次缩放:
dst_size = (2000, 3000)

将图像缩放到宽度为 2000 像素,高度为 3000 像素。

  • 第二次缩放:
dst_size = (5000, 5000)

将图像缩放到宽度和高度均为 5000 像素。

5. 总结
  • cv2.resize:用于对图像进行缩放操作,支持多种插值方法。
  • 插值方法对比
    • cv2.INTER_NEAREST:速度快,但图像质量较差。
    • cv2.INTER_LINEAR:图像质量较好,但计算速度稍慢。
  • 适用场景
    • 如果对图像质量要求不高,可以选择最邻近插值。
    • 如果需要较好的视觉效果,建议使用双线性插值。

九,线性灰度变化

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
%matplotlib inline 

# 定义线性灰度变化函数
# k>1 时 实现灰度数值的拉伸 
# 0<k<1 时 实现灰度数值的压缩
# k=-1 b=255 实现灰度反转 

def linear_trans(img, k, b=0): 
    # 计算灰度线性变化的映射表 
    trans_list = [(np.float32(x)*k+b) for x in range(256)] 
    # 将列表转换为np.array 
    trans_table =np.array(trans_list) 
    # 将超过[0,255]灰度范围的数值进行调整,并指定数据类型为uint8 
    trans_table[trans_table>255] = 255 
    trans_table[trans_table<0] = 0 
    trans_table = np.round(trans_table).astype(np.uint8) 
    # 使用OpenCV 的look up table 函数修改图像的灰度值 
    return cv2.LUT(img, trans_table) 

im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.title('original'),plt.imshow(im,'gray') 

# 反转 
im_inversion = linear_trans(im, -1, 255) 
plt.subplot(2,2,2),plt.title('reversed'),plt.imshow(im_inversion,'gray') 

# 灰度拉伸 
im_stretch = linear_trans(im, 1.2) 
plt.subplot(2,2,3),plt.title('stretch'),plt.imshow(im_stretch,'gray') 

# 灰度压缩 
im_compress = linear_trans(im, 0.4) 
plt.subplot(2,2,4),plt.title('compress'),plt.imshow(im_compress,'gray')

这段代码定义了一个线性灰度变换函数 linear_trans,用于对灰度图像进行灰度拉伸、压缩和反转操作,并展示了不同变换的效果。

1. 线性灰度变换函数 linear_trans
def linear_trans(img, k, b=0):
    # 计算灰度线性变化的映射表
    trans_list = [(np.float32(x) * k + b) for x in range(256)]
    # 将列表转换为np.array
    trans_table = np.array(trans_list)
    # 将超过[0, 255]灰度范围的数值进行调整,并指定数据类型为uint8
    trans_table[trans_table > 255] = 255
    trans_table[trans_table < 0] = 0
    trans_table = np.round(trans_table).astype(np.uint8)
    # 使用OpenCV的look up table函数修改图像的灰度值
    return cv2.LUT(img, trans_table)

灰度线性变换公式

线性灰度变换公式为:y = k * x + b,其中:

      1. x 是原始灰度值(范围为 [0, 256))。
      2. y 是变换后的灰度值。
      3. k 是斜率,控制灰度的拉伸或压缩。
      4. b 是偏移量,用于调整灰度值的范围。

当 k > 1 时,灰度值被拉伸,对比度增加。

当 0 < k < 1 时,灰度值被压缩,对比度降低。

当 k = -1 且 b = 255 时,实现灰度反转。

映射表的构建

使用列表推导式生成灰度值的映射表 trans_list。

将映射表转换为 NumPy 数组 trans_table。

灰度值范围调整

将超出 [0, 255] 范围的灰度值调整为边界值(0 或 255)。

使用 np.round 将浮点数四舍五入为整数,并将数据类型转换为 uint8。

应用变换

使用 OpenCV 的 cv2.LUT 函数(Look-Up Table)将映射表应用到图像上,完成灰度变换。

2. 图像处理与显示
im = cv2.imread(r'lenna.png', 0)  # 以灰度模式读取图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.title('original'), plt.imshow(im, 'gray')

图像以灰度模式读取(cv2.imread(r'lenna.png', 0)),返回的是单通道的灰度图像。

使用 Matplotlib 显示原始图像。

3. 灰度变换操作
(1)灰度反转
im_inversion = linear_trans(im, -1, 255)
plt.subplot(2, 2, 2), plt.title('reversed'), plt.imshow(im_inversion, 'gray')

灰度反转公式:y = -x + 255,将图像的灰度值反转,亮部变暗,暗部变亮。

(2)灰度拉伸
im_stretch = linear_trans(im, 1.2)
plt.subplot(2, 2, 3), plt.title('stretch'), plt.imshow(im_stretch, 'gray')

灰度拉伸公式:y = 1.2 * x,将灰度值拉伸,增强图像对比度。

(3)灰度压缩
im_compress = linear_trans(im, 0.4)
plt.subplot(2, 2, 4), plt.title('compress'), plt.imshow(im_compress, 'gray')

灰度压缩公式:y = 0.4 * x,将灰度值压缩,降低图像对比度。

4. 显示结果
  • 使用 Matplotlib 的 plt.subplot 和 plt.imshow 显示原始图像和变换后的图像:
    • 原始图像:位于第 1 个子图。
    • 灰度反转:位于第 2 个子图。
    • 灰度拉伸:位于第 3 个子图。
    • 灰度压缩:位于第 4 个子图。
5. 总结
  • 线性灰度变换:通过调整参数 k 和 b,可以实现灰度的拉伸、压缩和反转。
  • 映射表的构建:通过计算每个灰度值的映射关系,并将其应用到图像上。
  • cv2.LUT:OpenCV 提供的查找表函数,用于高效地应用灰度变换。
  • 应用场景
    • 灰度反转:用于增强图像对比度或突出特征。
    • 灰度拉伸:用于提高图像的动态范围。
    • 灰度压缩:用于降低图像的动态范围,便于后续处理。

十,伽马变换

def gamma_trans(img, gamma): 
    # 先归一化到1,做伽马计算,再还原到[0,255] 
    gamma_list = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)] 
    # 将列表转换为np.array,并指定数据类型为uint8 
    gamma_table = np.round(np.array(gamma_list)).astype(np.uint8) 
    # 使用OpenCV 的look up table 函数修改图像的灰度值 
    return cv2.LUT(img, gamma_table) 

im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(1,3,1),plt.title('original'),plt.imshow(im,'gray') 

# 使用伽马值为0.5 的变化,实现对暗部的拉升,亮部的压缩 
im_gamma05 = gamma_trans(im, 0.5) 
plt.subplot(1,3,2),plt.title('gammar=0.5'),plt.imshow(im_gamma05,'gray')

# 使用伽马值为2 的变化,实现对亮部的拉升,暗部的压缩 
im_gamma2 = gamma_trans(im, 2) 
plt.subplot(1,3,3),plt.title('gammart=2'),plt.imshow(im_gamma2,'gray')

这段代码展示了如何使用 OpenCV 的 直方图均衡化 功能对灰度图像进行处理,并对比了原始图像和均衡化图像的直方图。

1. 直方图均衡化

直方图均衡化是一种增强图像对比度的技术,通过调整图像的灰度分布,使其直方图接近均匀分布。这种方法特别适用于图像的全局对比度较低时,能够显著提升图像的视觉效果。

OpenCV 的 cv2.equalizeHist
im_equa1 = cv2.equalizeHist(im)

  • 输入:灰度图像 im。
  • 输出:经过直方图均衡化处理的图像 im_equa1。
  • 原理
    • 直方图均衡化通过计算累积分布函数(CDF)来重新分配灰度值,使得输出图像的直方图更加均匀。
    • 这种方法能够增强图像的细节,尤其是对于灰度分布不均匀的图像。
2. 代码解析
(1)读取图像并显示
im = cv2.imread(r'lenna.png', 0)  # 以灰度模式读取图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.imshow(im, 'gray'), plt.title('Original')

使用 cv2.imread 以灰度模式读取图像。

使用 Matplotlib 显示原始图像。

(2)直方图均衡化
im_equa1 = cv2.equalizeHist(im)
plt.subplot(2, 2, 3), plt.imshow(im_equa1, 'gray'), plt.title('Equalized')

调用 cv2.equalizeHist 对图像进行直方图均衡化

显示均衡化后的图像。

(3)显示原始图像的直方图
plt.subplot(2, 2, 2)
plt.hist(im.ravel(), 256, [0, 256], label='Original')
plt.legend()

使用 plt.hist 绘制原始图像的直方图。

    • im.ravel():将图像展平为一维数组。
    • 256:直方图的柱数(灰度级)。
    • [0, 256]:灰度值的范围。

添加图例 label='Original'。

(4)显示均衡化图像的直方图
plt.subplot(2, 2, 4)
plt.hist(im_equa1.ravel(), 256, [0, 256], label='Equalized')
plt.legend()

  • 绘制均衡化图像的直方图。
  • 添加图例 label='Equalized'。
3. 显示结果
  • 原始图像:位于第 1 个子图。
  • 原始图像的直方图:位于第 2 个子图。
  • 均衡化后的图像:位于第 3 个子图。
  • 均衡化图像的直方图:位于第 4 个子图。
4. 对比分析
  • 原始图像
    • 灰度分布可能集中在某些区域,导致对比度较低。
    • 直方图可能呈现不均匀分布。
  • 均衡化后的图像
    • 灰度分布更加均匀,对比度显著增强。
    • 直方图接近均匀分布,图像细节更加清晰。
5. 总结
  • 直方图均衡化:通过调整灰度分布,增强图像的全局对比度,特别适用于灰度分布不均匀的图像。
  • cv2.equalizeHist:OpenCV 提供的直方图均衡化函数,操作简单,效果显著。
  • 应用场景
    • 用于提升图像的视觉效果。
    • 作为图像预处理步骤,为后续的特征提取或分析提供更好的基础。

十一,直方图均衡化

import cv2 
from matplotlib import pyplot as plt 

im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.imshow(im,'gray') 

# 调用OpenCV 的直方图均衡化API 
im_equa1 = cv2.equalizeHist(im) 
plt.subplot(2,2,3),plt.imshow(im_equa1,'gray') 

# 显示原始图像的直方图 
plt.subplot(2,2,2) 
plt.hist(im.ravel(), 256, [0,256],label='org') 
plt.legend() 

# 显示均衡化图像的直方图 
plt.subplot(2,2,4) 
plt.hist(im_equa1.ravel(), 256, [0,256],label='equalize') 
plt.legend() 

plt.show()

这段代码展示了如何使用 OpenCV 的 cv2.equalizeHist 函数对灰度图像进行直方图均衡化处理,并通过 Matplotlib 显示原始图像、均衡化后的图像以及它们的直方图。

1. 代码解析
(1)读取图像
im = cv2.imread(r'lenna.png', 0)

使用 cv2.imread 函数以灰度模式读取图像 lenna.png。

参数 0 表示以灰度模式加载图像,返回的 im 是一个单通道的灰度图像。

(2)显示原始图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.imshow(im, 'gray'), plt.title('Original')

使用 Matplotlib 的 plt.imshow 函数显示原始灰度图像。

'gray' 参数指定使用灰度颜色映射。

(3)直方图均衡化
im_equa1 = cv2.equalizeHist(im)
plt.subplot(2, 2, 3), plt.imshow(im_equa1, 'gray'), plt.title('Equalized')

调用 cv2.equalizeHist 函数对灰度图像进行直方图均衡化

    • 输入:灰度图像 im。
    • 输出:均衡化后的图像 im_equa1。

显示均衡化后的图像。

(4)显示原始图像的直方图
plt.subplot(2, 2, 2)
plt.hist(im.ravel(), 256, [0, 256], label='Original')
plt.legend()

使用 plt.hist 绘制原始图像的直方图。

    • im.ravel():将图像展平为一维数组。
    • 256:直方图的柱数(灰度级)。
    • [0, 256]:灰度值的范围。
    • label='Original':为直方图添加图例。
(5)显示均衡化图像的直方图
plt.subplot(2, 2, 4)
plt.hist(im_equa1.ravel(), 256, [0, 256], label='Equalized')
plt.legend()

绘制均衡化后图像的直方图。

添加图例 label='Equalized'。

(6)显示结果
plt.show()

使用 plt.show() 显示所有子图。

2. 运行结果

子图 1:原始图像

显示原始灰度图像 im。

子图 2:原始图像的直方图

显示原始图像的灰度直方图。

直方图可能呈现不均匀分布,灰度值集中在某些区域,导致图像对比度较低。

子图 3:均衡化后的图像

显示经过直方图均衡化后的图像 im_equa1。

图像的对比度显著增强,细节更加清晰。

子图 4:均衡化图像的直方图

显示均衡化后图像的灰度直方图。

直方图更加均匀,灰度值分布更加广泛,说明对比度得到了提升。

3. 直方图均衡化的原理

直方图均衡化是一种增强图像对比度的方法,通过调整图像的灰度分布,使输出图像的直方图接近均匀分布。其主要步骤包括:

  1. 计算原始图像的直方图。
  2. 计算累积分布函数(CDF)。
  3. 根据 CDF 将原始灰度值重新映射到新的灰度值,使得输出图像的直方图更加均匀。
4. 总结
  • 直方图均衡化:通过调整灰度分布,增强图像的全局对比度。
  • cv2.equalizeHist:OpenCV 提供的直方图均衡化函数,适用于灰度图像。
  • 应用场景
    • 用于提升图像的视觉效果。
    • 作为图像预处理步骤,为后续的特征提取或分析提供更好的基础。

十二,分割阈值

img = cv2.imread(r'lenna.png',0) #直接读为灰度图像

#简单分割阈值 
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) 
#Otsu 滤波 
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_OTSU) 
print('简单分割阈值:',ret1) 
print('最佳分割阈值:',ret2) 
plt.figure(figsize=(8,8)) 
plt.subplot(221),plt.imshow(img,'gray') 
plt.subplot(222),plt.hist(img.ravel(),256)#.ravel 方法将矩阵转化为一维 
plt.subplot(223),plt.imshow(th1,'gray') 
plt.subplot(224),plt.imshow(th2,'gray')

简单分割阈值: 127.0

最佳分割阈值: 124.0

这段代码展示了如何使用 OpenCV 对灰度图像进行二值化处理,包括简单的阈值分割和基于 Otsu 方法的最佳阈值分割。同时,代码还展示了原始图像的直方图以及二值化后的结果。

1. 代码解析
(1)读取灰度图像
img = cv2.imread(r'lenna.png', 0)  # 直接读为灰度图像

使用 cv2.imread 函数以灰度模式读取图像 lenna.png。

参数 0 表示以灰度模式加载图像,返回的 img 是一个单通道的灰度图像。

(2)简单阈值分割
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.threshold:对图像进行二值化处理。

    • img:输入的灰度图像。
    • 127:手动指定的阈值。
    • 255:超过阈值后的最大值。
    • cv2.THRESH_BINARY:二值化模式,像素值大于阈值时设为 255,小于阈值时设为 0。

返回值

    • ret1:实际使用的阈值(在这个例子中是 127)。
    • th1:二值化后的图像。
(3)Otsu 阈值分割
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)

cv2.THRESH_OTSU:自动计算最佳阈值的方法。

    • Otsu 方法通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。
    • 在调用时,阈值参数(第二个参数)可以设为 0,因为 Otsu 方法会自动计算最佳阈值。

返回值

    • ret2:Otsu 方法计算出的最佳阈值。
    • th2:使用最佳阈值二值化后的图像。
(4)打印阈值
print('简单分割阈值:', ret1)  # 输出手动设置的阈值
print('最佳分割阈值:', ret2)  # 输出 Otsu 方法计算的最佳阈值

(5)显示结果
plt.figure(figsize=(8, 8))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original')
plt.subplot(222), plt.hist(img.ravel(), 256), plt.title('Histogram')
plt.subplot(223), plt.imshow(th1, 'gray'), plt.title('Simple Threshold')
plt.subplot(224), plt.imshow(th2, 'gray'), plt.title('Otsu Threshold')

子图 1:显示原始灰度图像。

子图 2:显示原始图像的直方图。

    • 使用 .ravel() 方法将图像展平为一维数组。

子图 3:显示简单阈值分割后的图像。

子图 4:显示 Otsu 阈值分割后的图像。

2. 运行结果

子图 1:原始图像

显示原始灰度图像。

子图 2:原始图像的直方图

显示原始图像的灰度直方图。

直方图反映了图像中不同灰度值的分布情况。

子图 3:简单阈值分割

使用手动设置的阈值(127)进行二值化处理。

阈值分割的结果可能依赖于手动选择的阈值,不一定是最优的。

子图 4:Otsu 阈值分割

使用 Otsu 方法自动计算的最佳阈值进行二值化处理。

Otsu 方法通常能够更好地适应图像的灰度分布,分割效果通常优于手动阈值分割。

3. Otsu 方法的优势
  • 自动选择阈值:Otsu 方法通过统计图像的灰度分布,自动计算最佳阈值,无需手动选择。
  • 适应性强:适用于灰度分布差异较大的图像,能够有效分离前景和背景。
  • 基于统计:通过最小化类内方差或最大化类间方差来选择阈值,具有较强的理论基础。
4. 总结
  • 简单阈值分割:手动设置阈值,适用于灰度分布较为均匀的图像。
  • Otsu 阈值分割:自动计算最佳阈值,适用于灰度分布复杂的图像,分割效果通常更好。
  • 应用场景
    • 简单阈值分割:当图像的前景和背景灰度差异明显时,手动选择阈值可能足够。
    • Otsu 阈值分割:当图像的灰度分布复杂或需要自动化处理时,Otsu 方法是更好的选择。

十三,图像的腐蚀与膨胀

1.定义结构元素
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))

cv2.getStructuringElement:用于创建形态学操作的结构元素。

    • cv2.MORPH_CROSS:指定结构元素的形状为十字形(+ 形)。
    • (5, 5):结构元素的大小为 5×5。

element:生成的结构元素是一个二维数组,表示操作的核(kernel)。十字形结构元素在腐蚀和膨胀操作中主要用于边缘检测和细化。

#定义结构元素 
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) 
plt.imshow(element,'gray')

2. 腐蚀操作
eroded = cv2.erode(bin_img, element)

cv2.erode:对二值图像进行腐蚀操作。

    • bin_img:输入的二值图像。
    • element:结构元素,定义了操作的形状和大小。

腐蚀原理

腐蚀操作会将图像中的前景(白色)区域逐渐缩小。

对于每个像素,如果结构元素覆盖的区域内包含背景(黑色)像素,则该像素被腐蚀为背景。

  • 应用场景
    • 用于去除小的噪声点。
    • 分离粘连的前景对象。
    • 细化图像中的线条。
#腐蚀图像 
eroded = cv2.erode(bin_img,element) 
#显示腐蚀后的图像 
plt.imshow(eroded,'gray') 
#原图像 
plt.figure() 
plt.imshow(bin_img,'gray')

3. 膨胀操作
dilated = cv2.dilate(bin_img, element)

cv2.dilate:对二值图像进行膨胀操作。

    • bin_img:输入的二值图像。
    • element:结构元素。

膨胀原理

膨胀操作会将图像中的前景(白色)区域逐渐扩大。

对于每个像素,如果结构元素覆盖的区域内包含前景(白色)像素,则该像素被膨胀为前景。

  • 应用场景
    • 用于填充前景对象中的小孔。
    • 连接断裂的部分。
    • 增加前景对象的尺寸。
#膨胀图像 
dilated = cv2.dilate(bin_img,element) 
#显示膨胀后的图像
plt.imshow(dilated,'gray'); 
#原图像 
plt.figure() 
plt.imshow(bin_img,'gray')

4. 总结
  • 腐蚀和膨胀:是形态学图像处理中的基本操作,用于修改图像的形状和结构。
  • 腐蚀
    • 使前景区域变小,背景区域变大。
    • 用于去除噪声、分离对象和细化结构。
  • 膨胀
    • 使前景区域变大,背景区域变小。
    • 用于填充孔洞、连接断裂部分和增加对象尺寸。
  • 结构元素
    • 定义了操作的形状和大小,对结果有重要影响。
    • 常用的结构元素包括矩形、圆形和十字形。

十四,图像的模糊处理

1. 中值模糊(Median Blur)
im_medianblur = cv2.medianBlur(im, 5)

cv2.medianBlur:对图像进行中值模糊处理。

    • im:输入图像。
    • 5:核大小(必须是奇数),表示中值滤波的窗口大小。

原理

中值模糊通过将每个像素替换为其邻域内的中值来减少噪声。

对于椒盐噪声等随机噪声,中值模糊效果较好。

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im)

# 调用OpenCV 的中值模糊API 
im_medianblur = cv2.medianBlur(im, 5) 
plt.figure() 
plt.imshow(im_medianblur) 
plt.show()

2. 均值模糊(Mean Blur)
im_meanblur = cv2.blur(im, (3, 3))

cv2.blur:对图像进行均值模糊处理。

    • im:输入图像。
    • (3, 3):核大小,表示均值滤波的窗口大小。

原理

均值模糊通过将每个像素替换为其邻域内的平均值来减少噪声。

对于高斯噪声,均值模糊有一定的平滑效果,但可能会使图像变得模糊。

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im) 
# 调用OpenCV 的均值模糊API 
im_meanblur = cv2.blur(im, (3, 3))

plt.figure() 
plt.imshow(im_meanblur) 
plt.show()

3. 高斯模糊(Gaussian Blur)
im_gaussianblur = cv2.GaussianBlur(im, (5, 5), 0)

cv2.GaussianBlur:对图像进行高斯模糊处理。

    • im:输入图像。
    • (5, 5):核大小(必须是奇数),表示高斯滤波的窗口大小。
    • 0:标准差(sigmaX),设置为 0 时,OpenCV 会根据核大小自动计算标准差。

原理

高斯模糊通过高斯核对图像进行加权平均,使图像平滑。

高斯模糊的效果比均值模糊更自然,边缘保留更好。

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im) 
# 调用OpenCV 的高斯模糊API 
im_gaussianblur = cv2.GaussianBlur(im, (5, 5), 0) 
plt.figure() 
plt.imshow(im_gaussianblur) 
plt.show()

4. 总结
  • 中值模糊
    • 适用于去除椒盐噪声。
    • 对图像细节的保留较好。
  • 均值模糊
    • 适用于高斯噪声。
    • 图像整体模糊,可能会丢失细节。
  • 高斯模糊
    • 效果自然,边缘保留较好。
    • 适用于需要平滑图像但保留细节的场景。

十五,图像锐化

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im)

# 锐化算子1 
sharpen_1 = np.array([ 
    [-1,-1,-1], 
    [-1,9,-1], 
    [-1,-1,-1]]) 
# 使用filter2D 进行滤波操作 
im_sharpen1 = cv2.filter2D(im,-1,sharpen_1) 
plt.figure() 
plt.imshow(im_sharpen1) 

# 锐化算子2 
sharpen_2 = np.array([ 
    [0,-1,0],
    [-1,8,-1], 
    [0,1,0]])/4.0 

# 使用filter2D 进行滤波操作 
im_sharpen2 = cv2.filter2D(im,-1,sharpen_2) 
plt.figure() 
plt.imshow(im_sharpen2)

原图

4邻接算子

8邻接算子

这段代码展示了如何使用 OpenCV 的 cv2.filter2D 函数结合自定义的锐化算子对图像进行锐化处理,并通过 Matplotlib 显示锐化后的结果。

1. 锐化算子的定义
(1)锐化算子 1
sharpen_1 = np.array([
    [-1, -1, -1],
    [-1, 9, -1],
    [-1, -1, -1]
])

特点

    • 这是一个 高通滤波器,用于增强图像的边缘。
    • 中心系数为 9,周围系数为 -1,表示对中心像素的增强和对周围像素的抑制。
    • 该算子的效果较为强烈,能够显著增强图像的边缘和细节。
(2)锐化算子 2
sharpen_2 = np.array([
    [0, -1, 0],
    [-1, 8, -1],
    [0, -1, 0]
]) / 4.0

特点

    • 这是一个 归一化后的锐化算子,通过除以 4.0,使得滤波器的权重总和为 1。
    • 中心系数为 8,周围系数为 -1,同样用于增强中心像素。
    • 该算子的效果较为温和,适合对图像进行轻微锐化。
2. 锐化操作
im_sharpen1 = cv2.filter2D(im, -1, sharpen_1)
im_sharpen2 = cv2.filter2D(im, -1, sharpen_2)

cv2.filter2D:用于对图像进行自定义滤波操作。

    • im:输入图像。
    • -1:目标图像的深度(-1 表示与输入图像深度相同)。
    • sharpen_1 或 sharpen_2:自定义的锐化算子。
3. 显示结果
plt.figure()
plt.imshow(im_sharpen1)
plt.title('Sharpened with Sharpen_1')

plt.figure()
plt.imshow(im_sharpen2)
plt.title('Sharpened with Sharpen_2')

使用 Matplotlib 显示锐化后的图像。

对比两种锐化算子的效果:

    • sharpen_1:锐化效果强烈,图像边缘更加突出。
    • sharpen_2:锐化效果温和,图像细节增强但不过度。
4. 运行结果
  • 原始图像
    • 显示原始的 RGB 图像。
  • 锐化后的图像 1
    • 使用 sharpen_1 算子锐化后的图像。
    • 图像边缘显著增强,细节更加突出,但可能会出现一些噪点。
  • 锐化后的图像 2
    • 使用 sharpen_2 算子锐化后的图像。
    • 图像细节增强,但锐化效果较为温和,适合对图像进行轻微调整。
5. 总结
  • 锐化操作:通过自定义的锐化算子增强图像的边缘和细节。
  • 锐化算子的选择
    • sharpen_1:适用于需要强烈锐化效果的场景,能够显著增强图像的边缘。
    • sharpen_2:适用于需要温和锐化效果的场景,能够增强图像细节而不引入过多噪点。
  • 应用场景
    • sharpen_1:适合处理边缘模糊的图像,增强图像的视觉效果。
    • sharpen_2:适合对图像进行轻微锐化,保留更多细节。

http://www.kler.cn/a/552205.html

相关文章:

  • Linux——Centos的安装与配置
  • WebSocket 小白快速入门(2025)
  • 随机生成多孔介质matlab程序
  • MySQL中count(1)和count(*) 的区别
  • 基于Java+Swing+Mysql实现旅游管理信息系统
  • 基于 Spring Boot 的 “宠物领养系统” 系统的设计与实现
  • 23种设计模式 - 建造者模式
  • JUC并发—6.AQS源码分析二
  • CDN进阶学习<->
  • Git Pull 报错解决方案:fatal: Need to specify how to reconcile divergent branches
  • HarmonyOS4-工具安装
  • 【Linux Redis】关于用docker拉取Redis后,让虚拟机运行起来redis,并使得其可以连接到虚拟机外的navicat。
  • leaflet前端初始化项目
  • 【ARTS】【LeetCode-977】有序数组的平方
  • 单元测试整理
  • 2023年区块链职业技能大赛——区块链应用技术(一)模块一
  • Ubuntu 24或最新Ubuntu 安装 英伟达显卡驱动
  • 共享储能系统在新能源消纳中的应用及能源区块链的数据共享与全同态加密信息披露机制
  • 【ClickHouse 特性及应用场景】
  • 【git】已上传虚拟环境的项目更改成不再上传虚拟环境