图像处理入门:从基础到边缘检测与轮廓提取


图像处理入门:从基础到边缘检测与轮廓提取

在计算机视觉和图像处理领域,图像预处理是实现高级功能(如目标检测、图像分割和特征提取)的基础。本文将介绍一些常见的图像处理技术,包括开运算、闭运算、梯度运算、边缘检测和轮廓检测,并通过代码示例展示如何使用 OpenCV 实现这些功能。

1. 开运算与闭运算

开运算

开运算是一种形态学图像处理操作,其基本步骤是先腐蚀后膨胀。它的主要作用包括:

  • 平滑物体的轮廓。
  • 断开较窄的断裂部分。
  • 消除细小的突出物。

以下是使用 OpenCV 实现开运算的代码示例:

import cv2
import numpy as np

# 读取图像
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src2', zhiwen)
cv2.waitKey(0)

# 定义结构元素
kernel = np.ones((2, 2), np.uint8)

# 开运算
zhiwen_new = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)
cv2.imshow('zhiwen_new', zhiwen_new)
cv2.waitKey(0)

运行结果
在这里插入图片描述

闭运算

闭运算与开运算相反,其步骤是先膨胀后腐蚀。闭运算的主要作用包括:

  • 合并较窄的间断部分。
  • 消除小孔洞。
  • 填补轮廓线中的裂缝。

以下是闭运算的代码示例:

# 读取图像
zhiwen_duan = cv2.imread('zhiwen_duan.png')
cv2.imshow('src3', zhiwen_duan)
cv2.waitKey(0)

# 定义结构元素
kernel = np.ones((4, 4), np.uint8)

# 闭运算
zhiwen_new1 = cv2.morphologyEx(zhiwen_duan, cv2.MORPH_CLOSE, kernel)
cv2.imshow('zhiwen_new1n', zhiwen_new1)
cv2.waitKey(0)

运行结果
在这里插入图片描述


2. 梯度运算

梯度运算是通过计算图像的梯度来突出显示图像中强度变化剧烈的部分。它可以通过膨胀和腐蚀的差值来实现。

以下是梯度运算的代码示例:

# 读取图像
wenzi = cv2.imread('wenzi.png')
if wenzi is not None:
    cv2.imshow('wenzi_new', wenzi)
    cv2.waitKey(0)

    # 定义结构元素
    kernel = np.ones((2, 2), np.uint8)

    # 膨胀
    pz_wenzi = cv2.dilate(wenzi, kernel, iterations=1)
    cv2.imshow('pz_wenzie', pz_wenzi)
    cv2.waitKey(0)

    # 腐蚀
    fs_wenzi = cv2.erode(wenzi, kernel, iterations=1)
    cv2.imshow('fs_wenz', fs_wenzi)
    cv2.waitKey(0)

    # 梯度运算
    bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
    cv2.imshow('bianyuan', bianyuan)
    cv2.waitKey(0)
else:
    print("Error: Unable to load 'wenzi.png'")

运行结果
在这里插入图片描述

3. 顶帽和黑帽

顶帽操作

顶帽操作的公式是:原始图像 - 开运算结果。它用于增强图像中的亮细节,特别是当这些细节比结构元素小时。

黑帽操作

黑帽操作的公式是:闭运算结果 - 原始图像。它用于增强图像中的暗细节,特别是当这些细节比结构元素小时。

以下是顶帽和黑帽操作的代码示例:

# 读取图像
sun = cv2.imread('sun.png')
if sun is not None:
    cv2.imshow('sun_yuantu', sun)
    cv2.waitKey(0)

    # 定义结构元素
    kernel = np.ones((2, 2), np.uint8)

    # 开运算
    open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
    cv2.imshow('open_sunn', open_sun)
    cv2.waitKey(0)

    # 顶帽操作
    tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
    cv2.imshow('TOPHAT', tophat)
    cv2.waitKey(0)

    # 闭运算
    close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('close_sun', close_sun)
    cv2.waitKey(0)

    # 黑帽操作
    blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
    cv2.imshow('Blackhat', blackhat)
    cv2.waitKey(0)
else:
    print("Error: Unable to load 'sun.png'")

*运行结果
在这里插入图片描述

4. 边缘检测

边缘检测是图像处理中的一个重要任务,它用于识别图像中物体的边界。常见的边缘检测方法包括 Sobel 算子、Scharr 算子和 Canny 算子。

Sobel 算子

Sobel 算子用于计算图像的梯度,可以分别计算 x 方向和 y 方向的边缘。

以下是 Sobel 算子的代码示例:

# 读取图像
yuan = cv2.imread('yuan.png')
if yuan is not None:
    cv2.imshow('yuan', yuan)
    cv2.waitKey(0)

    # x 方向上的边缘
    yuan_x = cv2.Sobel(yuan, -1, dx=1, dy=0)
    cv2.imshow('yuan_x', yuan_x)
    cv2.waitKey(0)

    # y 方向上的边缘
    yuan_y = cv2.Sobel(yuan, -1, dx=0, dy=1)
    cv2.imshow('yuan_y', yuan_y)
    cv2.waitKey(0)

    # 组合 x 和 y 方向的边缘
    yuan_xy_full = cv2.addWeighted(yuan_x, 1, yuan_y, 1, 0)
    cv2.imshow('yuan_xy_full', yuan_xy_full)
    cv2.waitKey(0)
else:
    print("Error: Unable to load 'yuan.png'")

运行结果
在这里插入图片描述

Canny 边缘检测

Canny 边缘检测是一种更高级的边缘检测算法,它通过多步处理来提取清晰的边缘。

以下是 Canny 边缘检测的代码示例:

# 读取图像
zl = cv2.imread('R-C.jpg', cv2.IMREAD_GRAYSCALE)
if zl is not None:
    cv2.imshow('zl', zl)
    cv2.waitKey(0)

    # Canny 边缘检测
    zl_canny = cv2.Canny(zl, 100, 150)
    cv2.imshow(' zl_canny', zl_canny)
    cv2.waitKey(0)
else:
    print("Error: Unable to load 'R-C.jpg'")

运行结果
在这里插入图片描述

5. 轮廓检测

轮廓检测用于识别图像中物体的轮廓,通常用于目标检测和图像分割。

以下是轮廓检测的代码示例:

# 读取图像
phone = cv2.imread('phone.png')
if phone is not None:
    phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
    cv2.imshow('phone_b', phone_gray)
    cv2.waitKey(0)

    # 二值化
    ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
    cv2.imshow('phone_binary', phone_binary)
    cv2.waitKey(0)

    # 轮廓检测
    contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    # 绘制轮廓
    image_copy = phone.copy()
    cv2.drawContours(image_copy, contours, -1, (0, 255, 0), thickness=2)
    cv2.imshow('Contours_show', image_copy)
    cv2.waitKey(0)
else:
    print("Error: Unable to load 'phone.png'")

运行结果
在这里插入图片描述

总结

本文介绍了几种常见的图像处理技术,包括开运算、闭运算、梯度运算、顶帽和黑帽操作、边缘检测和轮廓检测。通过 OpenCV,我们可以轻松实现这些功能,并应用于实际的图像处理任务中。希望本文对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值