图片边缘到底怎么提取?用华为云码道开发 OpenCV Canny 参数可视化工具

前面已经连续做了图片清晰度检测、图像差异检测、主色提取和自动纠偏,这次继续做一个简单直观的 OpenCV 小工具:

Canny 边缘检测可视化工具。

平时在做图像处理时,经常会看到 Canny 这个名字。

它可以把一张普通图片转成一张只保留轮廓和边缘的结果图。

但很多刚开始接触 OpenCV 的人会有一个问题:

Low Threshold 和 High Threshold 到底是什么意思?

所以这次我用华为云码道辅助开发了一个简单的页面,把这两个参数直接做成滑块,可以一边调参数,一边看边缘结果。


一、这个工具能做什么?

功能保持得比较简单。

目前支持:

  • 上传 JPG / PNG 图片
  • 使用 OpenCV Canny 进行边缘检测
  • 设置 Low Threshold
  • 设置 High Threshold
  • 显示原图
  • 显示边缘检测结果
  • 统计 Edge Pixel Count
  • 下载边缘图 PNG

整个流程就是:

上传图片

↓

设置 Canny 参数

↓

生成边缘图

↓

显示 Edge Pixel Count

↓

下载结果


二、Canny 是做什么的?

Canny 是一种经典的边缘检测算法。

它的目标很简单:

找到图像中灰度变化比较明显的位置。

比如一张图片中的:

人物轮廓

建筑边缘

树叶边缘

文字边缘

物体交界处

这些地方通常会有比较明显的像素变化。

Canny 就会把这些位置提取出来。

最终输出通常是一张黑白图:

黑色区域:

没有明显边缘

白色区域:

检测到边缘


三、这次核心代码其实很简单

OpenCV 中进行 Canny 边缘检测的核心代码只有一行:

cv2.Canny(gray, low_threshold, high_threshold)

完整流程可以理解成:

原图

↓

灰度化

↓

Canny

↓

边缘结果

其中最重要的两个参数就是:

Low Threshold

和:

High Threshold


四、Low Threshold 和 High Threshold 是什么意思?

这两个参数共同决定:

哪些边缘应该留下。

简单理解:

High Threshold 用来判断:

"这个边缘是不是足够强?"

如果一个位置的梯度高于 High Threshold,就更容易被认为是强边缘。

Low Threshold 则用于处理相对弱一些的边缘。

如果某些较弱的边缘和强边缘相连,也有可能被保留下来。

所以两个参数配合以后,可以避免:

边缘太多

或者:

边缘太少

的问题。


五、真实测试参数

这次使用的是一张狗狗公园图片。

图片尺寸:

1536 × 1024

设置:

Low Threshold:

50

High Threshold:

150

然后点击:

Generate edges

程序最终成功生成了边缘图。


六、最终检测到了 116,309 个边缘像素

这次页面最终统计:

Edge Pixel Count:116,309

也就是说,在:

1536 × 1024

这张图片中,有 116,309 个像素被当前参数判断为边缘像素。

这并不是说:

"图片里有 116,309 条边"。

而是表示:

边缘结果图中有 116,309 个像素属于检测到的边缘区域。


七、实际效果怎么样?

从结果图中可以看到很多细节都被提取出来了。

比如:

狗狗毛发

耳朵轮廓

脸部边缘

草地纹理

树叶

建筑物轮廓

湖边结构

都能在 Edge Result 中看到。

特别是狗狗毛发这种纹理比较丰富的区域,会产生很多细小边缘。

所以这一组参数:

Low = 50

High = 150

得到的边缘结果还是比较丰富的。


八、为什么阈值低会出现更多边缘?

如果把阈值设置得比较低,

一些比较弱的灰度变化也可能被保留下来。

所以结果中会出现更多:

细节

纹理

弱边缘

比如:

草地

毛发

树叶

这些区域就会产生大量白色边缘。

如果把阈值调高,

程序就会更加严格。

最后可能只保留:

建筑轮廓

狗狗外轮廓

比较明显的结构线

所以 Canny 并不存在一组适合所有图片的固定参数。

通常还是要根据图像内容进行调整。


九、Edge Pixel Count 有什么用?

这次我额外统计了:

Edge Pixel Count

它可以用来简单观察:

当前参数提取出了多少边缘。

比如同一张图片:

阈值低

→ Edge Pixel Count 通常更高

阈值高

→ Edge Pixel Count 通常更低

所以这个数字虽然不是一个专业图像质量指标,

但很适合辅助观察:

参数变化到底让结果发生了多大变化。


十、Canny 可以用在哪里?

虽然这次只是做了一个可视化小工具,但 Canny 实际上是很多传统计算机视觉流程里的基础步骤。

例如:

轮廓检测

直线检测

文档边缘检测

车道线检测

形状分析

目标区域定位

前面做自动纠偏的时候,用到的:

HoughLinesP

其实也经常会先配合 Canny 使用。

也就是:

原图

↓

Canny 找边缘

↓

Hough 找直线

所以这次这个小工具,也正好把前一篇自动纠偏中的一个核心步骤单独拿出来做了可视化。


十一、为什么这次还是不做复杂功能?

最近这几篇都是一个思路:

一个小项目解决一个具体问题。

这次技术栈依然只有:

Python

OpenCV

FastAPI

原生 HTML / CSS / JavaScript

没有加入:

数据库

账号系统

复杂前端框架

深度学习模型

功能也只有:

上传

调参数

生成结果

下载

对于学习 Canny 来说,这样反而更直观。


总结

这次用华为云码道辅助开发了一个:

OpenCV Canny 参数可视化工具。

核心流程:

上传图片

↓

灰度化

↓

设置 Low Threshold

↓

设置 High Threshold

↓

Canny Edge Detection

↓

统计 Edge Pixel Count

↓

显示边缘图

真实测试参数:

图片尺寸:

1536 × 1024

Low Threshold:

50

High Threshold:

150

最终:

Edge Pixel Count:116,309

从结果中可以看到,狗狗、草地、树木和建筑等区域的轮廓都被成功提取出来。

前面几篇分别回答了:

图片糊不糊?

两张图片哪里不一样?

图片主要是什么颜色?

图片歪了怎么办?

这一篇则回答:

图片里的边缘到底怎么提取?

下一篇可以继续做一个同样简单的 OpenCV 小工具:

图片里有几个明显轮廓?用华为云码道开发 OpenCV 轮廓检测工具

直接在 Canny 结果基础上继续:

findContours() → 找轮廓 → 过滤小区域 → 给目标画框。

相关推荐
xbzb9 小时前
华为云弹性文件服务 SFS 与云备份 CBR:一个目录,多台机器共享
华为云·备份·nfs·挂载·sfs·cbr
Linux界最忧郁之人2 天前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack
yunlaodacom2 天前
做异地灾备,华为云国际站 OBS 跨地域复制该怎么配置?
安全·华为云·云计算
Z21-X3 天前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云
小南家的青蛙3 天前
华为云DCS全形态原生Redis命令兼容性测试方案
redis·华为云·兼容性·兼容性测试·dcs
Z21-X3 天前
云原生运维实战笔记:华为云计算与网络类服务全景解析
运维·笔记·学习·云原生·华为云
終不似少年遊*6 天前
【Skill】为中型研发团队制作的敏捷迭代AI副驾Skill
人工智能·python·华为云·agent·ai编程·skill
熊猫钓鱼>_>7 天前
上架审核常见驳回与隐私合规清单:过审前先自查这 8 条【鸿蒙心迹】
开发语言·前端·华为·华为云·harmonyos·openharmony·ai制作
hyunbar8 天前
华为云 GaussDB(DWS) 和 PG 的谓词下推有何差异
华为云·gaussdb·dws
JoePotter9 天前
从零搭建华为云 EVS 每日自动快照:hcloud + PowerShell + 邮件报告实战
华为云·自动化运维·powershell·evs·koocli·快照备份·mailozaurr