图像处理入门:边界填充、阈值处理、平滑处理与形态学操作

深入探索OpenCV:图像处理的边界填充、阈值处理、平滑处理与形态学操作

在图像处理和计算机视觉领域,OpenCV 是一个功能强大的库,提供了丰富的图像处理工具。本文将通过一系列代码示例,深入探讨 OpenCV 中的边界填充、阈值处理、平滑处理和形态学操作。这些技术在图像预处理、特征提取和图像增强中具有广泛的应用。

一、边界填充

边界填充(Padding)是图像处理中的一种常用技术,用于在图像的边缘添加额外的像素。这在图像卷积操作(如滤波)中尤为重要,因为卷积核在边缘处可能会超出图像边界。OpenCV 提供了 cv2.copyMakeBorder() 函数来实现边界填充,支持多种填充方式。

代码示例

import cv2

# 读取图像
g = cv2.imread('girl.png')
g = cv2.resize(g, (320, 240))  # 调整图像大小

# 定义边界宽度
top, bottom, left, right = 50, 50, 50, 50

# 不同的边界填充方式
constant = cv2.copyMakeBorder(g, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(229, 25, 80))
reflect = cv2.copyMakeBorder(g, top, bottom, left, right, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(g, top, bottom, left, right, cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(g, top, bottom, left, right, cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(g, top, bottom, left, right, cv2.BORDER_WRAP)

# 显示结果
cv2.imshow('Original', g)
cv2.imshow('CONSTANT', constant)
cv2.imshow('REFLECT', reflect)
cv2.imshow('REFLECT_101', reflect101)
cv2.imshow('REPLICATE', replicate)
cv2.imshow('WRAP', wrap)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果

在这里插入图片描述

  • CONSTANT:边界被填充为指定的颜色(紫色)。
  • REFLECT:边界像素被镜像反射,类似于
  • REFLECT_101:与 REFLECT 类似,但边界处不复制最后一个像素,类似于 `。
  • REPLICATE:边界像素被复制,类似于 ``。
  • WRAP:边界像素被循环复制,类似于

二、阈值处理

阈值处理是一种常用的图像分割方法,用于将图像中的像素值分为两类。OpenCV 提供了 cv2.threshold() 函数来实现阈值处理,支持多种阈值类型。

代码示例

import cv2

# 读取灰度图像
image = cv2.imread('girl.png', 0)

# 不同的阈值处理类型
ret, binary = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY)
ret1, binaryinv = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY_INV)
ret2, trunc = cv2.threshold(image, 175, 255, cv2.THRESH_TRUNC)
ret3, tozero = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO)
ret4, tozeroinv = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO_INV)

# 显示结果
cv2.imshow('Original', image)
cv2.imshow('BINARY', binary)
cv2.imshow('BINARY_INV', binaryinv)
cv2.imshow('TRUNC', trunc)
cv2.imshow('TOZERO', tozero)
cv2.imshow('TOZERO_INV', tozeroinv)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果

在这里插入图片描述

  • BINARY:像素值大于阈值的变为最大值(255),小于阈值的变为 0。
  • BINARY_INV:像素值大于阈值的变为 0,小于阈值的变为最大值(255)。
  • TRUNC:像素值大于阈值的被截断为阈值,小于阈值的保持不变。
  • TOZERO:像素值大于阈值的保持不变,小于阈值的变为 0。
  • TOZERO_INV:像素值大于阈值的变为 0,小于阈值的保持不变。

三、平滑处理

平滑处理(Smoothing)是一种用于消除图像噪声或细节的技术。OpenCV 提供了多种平滑方法,包括均值滤波、高斯滤波和中值滤波。

代码示例

import cv2
import numpy as np

# 添加椒盐噪声的函数
def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    h, w = image.shape[:2]
    for i in range(n):
        x = np.random.randint(1, h)
        y = np.random.randint(1, w)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0
        else:
            result[x, y] = 255
    return result

# 读取图像并添加噪声
image = cv2.imread('girl.png')
noise = add_peppersalt_noise(image)

# 不同的平滑处理方法
blur_1 = cv2.blur(noise, (3, 3))  # 均值滤波
blur_2 = cv2.blur(noise, (5, 5))  # 均值滤波
GaussianB = cv2.GaussianBlur(noise, (3, 3), 1)  # 高斯滤波
medianB = cv2.medianBlur(noise, 3)  # 中值滤波

# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Noise', noise)
cv2.imshow('Blur (3x3)', blur_1)
cv2.imshow('Blur (5x5)', blur_2)
cv2.imshow('Gaussian Blur', GaussianB)
cv2.imshow('Median Blur', medianB)
cv2.waitKey(0)
cv2.destroyAllWindows(

输出结果

在这里插入图片描述

  • 均值滤波:通过计算邻域内像素的平均值来平滑图像,适合去除随机噪声。
  • 高斯滤波:通过高斯核对图像进行加权平均,平滑效果较好,同时能够保留更多的细节。
  • 中值滤波:通过取邻域内的中值来平滑图像,对椒盐噪声的去除效果特别好。

四、形态学操作

形态学操作是一种基于图像形状的处理方法,常用于图像的膨胀、腐蚀、开运算和闭运算等操作。这些操作可以用来增强图像的某些特征或去除噪声。

代码示例

import cv2
import numpy as np

# 图像腐蚀
sun = cv2.imread('sun.png')
kernel = np.ones((3, 3), np.uint8)
erosion_1 = cv2.erode(sun, kernel, iterations=3)

# 图像膨胀
wenzi = cv2.imread('wenzi.png')
kernel = np.ones((2, 2), np.uint8)
wenzi_new = cv2.dilate(wenzi, kernel, iterations=5)

# 显示结果
cv2.imshow('Original Sun', sun)
cv2.imshow('Eroded Sun', erosion_1)
cv2.imshow('Original Wenzi', wenzi)
cv2.imshow('Dilated Wenzi', wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果

在这里插入图片描述

  • 腐蚀操作:将图像中的白色区域缩小,通常用于去除小的白色噪声点。
  • 膨胀操作:将图像中的白色区域扩大,通常用于填补小的黑色孔洞。

总结

本文通过一系列代码示例,详细介绍了 OpenCV 中的边界填充、阈值处理、平滑处理和形态学操作。这些技术在图像预处理、特征提取和图像增强中具有广泛的应用。通过掌握这些基本的图像处理方法,我们可以更好地理解和应用更高级的计算机视觉算法。

如果你对图像处理感兴趣,或者想了解更多关于 OpenCV 的知识,欢迎继续关注我的博客!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值