图片边缘到底怎么提取?用华为云码道开发 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() → 找轮廓 → 过滤小区域 → 给目标画框。

相关推荐
云老大-阿里云国际站代理商3 小时前
华为云国际站渠道代理商:CSS查询很慢但CPU不高?磁盘I/O、JVM与分片问题怎么排查
css·jvm·华为云
晨间晓8 小时前
图片边缘主要朝哪里?用华为云码道开发 OpenCV 梯度方向分析工具
人工智能·opencv·华为云
晨间晓8 小时前
图片是什么色调?用华为云码道开发 OpenCV HSV 色调分布分析工具
人工智能·opencv·华为云
晨间晓1 天前
图片到底有多亮?用华为云码道开发 OpenCV 亮度分析工具
人工智能·opencv·华为云
晨间晓1 天前
图片对比度够不够?用华为云码道开发 OpenCV 对比度分析工具
人工智能·opencv·华为云
晨间晓1 天前
图片到底偏什么颜色?用华为云码道开发 OpenCV 色彩偏移分析工具
javascript·opencv·华为云
晨间晓1 天前
图片是不是过曝了?用华为云码道开发 OpenCV 过曝区域检测工具
人工智能·opencv·华为云
晨间晓2 天前
图片拍歪了怎么办?用华为云码道开发 OpenCV 自动纠偏工具
人工智能·opencv·华为云
ZZHow10243 天前
Ascend C算子开发(高级)笔记
c++·人工智能·笔记·深度学习·华为云