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

opencv基础学习与实战(3)图像形态学与边缘检测

一.图像形态学

1.图像腐蚀

函数为:cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
参数含义:
src: 输入的图像
kernel: 用于腐蚀的结构元件如果element = Mat(), 则使用3 × 3的矩形结构单元。
dst: 它是与src相同大小和类型的输出图像。
iterations:腐蚀操作的迭代次数, 默认为1。次数越多, 腐蚀操作执行的次数越多,腐蚀效果越明显
import numpy as np
sun = cv2.imread('erode1.png')
cv2.imshow('src', sun)
# cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)  # 设置kenenel大小, 核改为5*5试试
erosion_1 = cv2.erode(sun,kernel,iterations=2)  # iterations改为5试试
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)

效果:

可以观察出原图的细线被腐蚀消失了

2.图像膨胀

函数为:
cv2.dilate(img, kernel, iterations)
参数含义:
img - 目标图片
kernel - 进行操作的内核,默认为3×3的矩阵
iterations - 膨胀次数,默认为1
wenzi = cv2.imread('word.png')
cv2.imshow('src1', wenzi)
# cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)  # 设置kenenel大小
wenzi_new = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)

效果:

可以观察到,膨胀后的字母变粗与变亮了

3.开运算与必运算

开运算:先腐蚀后膨胀。作用:平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src2', zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)  # 设置kenenel大小
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((5,5),np.uint8)  # 设置kenenel大小
zhiwen_new = cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel)  # 闭运算
cv2.imshow('zhiwen_new1',zhiwen_new)
cv2.waitKey(0)

效果:

图像的断裂处有些许拟合

4.梯度运算

梯度运算:膨胀-(减去)腐蚀 作用:突出显示图像中强度变化剧烈的地方
wenzi = cv2.imread('word.png')
cv2.imshow('word_new', wenzi)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)  # 设置kenenel大小
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('bianyuan', bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:

字母的边缘更明显了

5、顶帽和黑帽

顶帽 = 原始图像 - 开运算结果(先腐蚀后膨胀)
黑帽 = 闭运算(先膨胀后腐蚀) - 原始图像
sun = cv2.imread('erode1.png')
cv2.imshow('sun_yuantu', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)  # 设置kenenel大小
# # 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('TOPHAT', tophat)
cv2.waitKey(0)
# # 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('BLACKHAT', blackhat)
cv2.waitKey(0)

效果:

二.边缘检测

sobel算子

cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
参数:
src: 输入图像
ddepth: 输出图像的深度(可以理解为数据类型), -1表示与原图相同的深度
dx, dy: 当组合为dx=1, dy=0时为x方向的一阶导数, 当组合为dx=0, dy=1时为y方向的一阶导数(如果同时为1, 通常效果不佳)
ksize: (可选参数)Sobel算子的大小, 必须是1,3,5或者7, 默认为3.
tu=cv2.imread(r'longpic.png')
pro_tu=cv2.Sobel(tu,ddepth=cv2.CV_64F,dx=1,dy=0)
pro_tu_fill_x=cv2.convertScaleAbs(pro_tu)
pro_tu=cv2.Sobel(tu,ddepth=cv2.CV_64F,dx=0,dy=1)
pro_tu_fill_y=cv2.convertScaleAbs(pro_tu)
pro_tu_fill_xy=cv2.addWeighted(pro_tu_fill_x,1,pro_tu_fill_y,1,0)
cv2.imshow('tu2',pro_tu_fill_xy)
cv2.waitKey(0)

laplacian算子

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
参数说明:
src: 输入图像,可以是灰度图像,也可以是多通道的彩色图像
ddepth: 输出图片的数据深度:
ksize: 计算二阶导数滤波器的孔径大小,必须为正奇数,可选项
scale: 缩放比例因子,可选项,默认值为 1
delta: 输出图像的偏移量,可选项,默认值为 0
zl = cv2.imread('longpic.png', cv2.IMREAD_GRAYSCALE)
zl_lap = cv2.Laplacian(zl, cv2.CV_64F)
zl_lap_full = cv2.convertScaleAbs(zl_lap)  # 转换为绝对值,负数转换为正数
cv2.imshow('zl_lap_full', zl_lap_full)
cv2.waitKey(0)

canny算子(最常用,sobel升级版)

canny边缘检测
cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]]])
image 为输入图像。
threshold1 表示处理过程中的第一个阈值。fL
threshold2 表示处理过程中的第二个阈值。fH
zl = cv2.imread('longpic.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl', zl)
cv2.waitKey(0)
zl_canny = cv2.Canny(zl, 110, 120)  # 低,高
cv2.imshow('zl_canny', zl_canny)
cv2.waitKey(0)

http://www.dtcms.com/a/342245.html

相关文章:

  • langgraph快速搭建agent后端和react前端
  • TOC语法源码生成脚本:基础易纷呈,进阶心渲染(python)
  • 基于 Flask 与 Milvus 构建高效图片搜索引擎,可通过API接入,支持Docker一键部署
  • java学习 1504 统计全1子矩形 + python生成ppt部分思路
  • 项目从 MySQL 切换 PostgreSQL,踩了太多的坑
  • elementui附件上传自定义文件列表,实现传完即可预览、下载、删除,二次封装el-upload
  • yggjs_react使用教程 v0.1.1
  • yggjs_rlayout 科技风主题后台管理系统实战
  • React:Umi + React + Ant Design Pro的基础上接入Mock数据
  • nuxt3 404页面 如何写
  • 当云手机进入不了游戏怎么办?
  • 1504. 统计全 1 子矩形
  • windows中bat脚本中一些操作(一)
  • 关于 VScode 无法连接 Linux 主机并报错 <未能下载 VScode 服务器> 的解决方案
  • 强化学习算法分类与介绍(含权重更新公式)
  • 从vue2到vue3
  • VASPKIT模版INCAR笔记
  • K8s快速上手-微服务篇篇
  • 【ZeroNews】OpenWrt路由器小存储开启内网穿透
  • 2025年8月新算法—云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)
  • C++ this 指针
  • 2025-08-21 Python进阶2——数据结构
  • Rancher部署的K8S集群服务节点上执行 kubectl 命令
  • JavaCV + Spring 实现高效 RTSP 视频流帧缓存与管理
  • MybatisPlusAutoConfiguration源码阅读
  • 稀土元素带来农业科技革命
  • Qt5 数据库编程详解
  • “Data + AI Agent”技术架构解析:衡石科技如何重塑数据智能演进路径?
  • YggJS RToast(科技风全局消息通知库) 使用教程 v0.1.0(详细教学)
  • RoPE, 2D RoPE, 3D RoPE和复数