canny边缘检测
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
首先需要准备一张图片orange.jpg,如下

经过canny边缘检测后的效果如下:

下面给大家演示了C#、C++、Python这三种环境下是如何进行canny边缘检测。
C#版本代码如下:
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
// 【1】读取图像
Mat srcImage = Cv2.ImRead("../../../images/orange.jpg");
Mat srcImage1 = srcImage.Clone();
// 【2】显示原图
Cv2.ImShow("原图", srcImage);
// 【3】创建与src同类型和大小的矩阵(dst)
Mat dstImage = new Mat(srcImage.Cols, srcImage.Rows, srcImage.Type());
// 【4】将原图像转换为灰度图像
Mat grayImage = new Mat();
Cv2.CvtColor(srcImage1, grayImage, ColorConversionCodes.BGR2GRAY);
// 【5】先用使用 3x3内核来降噪
Mat edge = new Mat();
Cv2.Blur(grayImage, edge, new OpenCvSharp.Size() { Width = 3, Height = 3 });
// 【6】运行Canny算子
Cv2.Canny(edge, edge, 3, 9, 3);
// 【7】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
srcImage1.CopyTo(dstImage, edge);
// 【8】显示效果图
Cv2.ImShow("【效果图】整体方向Sobel", dstImage);
Cv2.WaitKey(0);
// 【9】在pictureBox1中显示效果图
//Bitmap map = BitmapConverter.ToBitmap(dstImage);
//pictureBox1.Image = map;
}
}
}
C++版本代码如下:
#include <vector>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//载入原始图
Mat srcImage = imread("../images/orange.jpg");
Mat srcImage1 = srcImage.clone();
//显示原始图
imshow("【原始图】Canny边缘检测", srcImage);
//----------------------------------------------------------------------------------
// 一、最简单的canny用法,拿到原图后直接用。
// 注意:此方法在OpenCV2中可用,在OpenCV3中已失效
//----------------------------------------------------------------------------------
//Canny(srcImage, srcImage, 150, 100, 3);
//imshow("【效果图】Canny边缘检测", srcImage);
//----------------------------------------------------------------------------------
// 二、高阶的canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
//----------------------------------------------------------------------------------
Mat dstImage, edge, grayImage;
// 【1】创建与src同类型和大小的矩阵(dst)
dstImage.create(srcImage1.size(), srcImage1.type());
// 【2】将原图像转换为灰度图像
cvtColor(srcImage1, grayImage, COLOR_BGR2GRAY);
// 【3】先用使用 3x3内核来降噪
blur(grayImage, edge, Size(3, 3));
// 【4】运行Canny算子
Canny(edge, edge, 3, 9, 3);
//【5】将g_dstImage内的所有元素设置为0
dstImage = Scalar::all(0);
//【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
srcImage1.copyTo(dstImage, edge);
//【7】显示效果图
imshow("【效果图】Canny边缘检测2", dstImage);
waitKey(0);
return 0;
}
Python版本代码如下:
import cv2
import numpy as np
def zh_ch(string):
return string.encode("gbk").decode(errors="ignore")
# 载入原始图
srcImage = cv2.imread('../images/orange.jpg')
srcImage1 = srcImage.copy()
# 显示原始图
cv2.imshow(zh_ch('原始图'), srcImage)
# 【1】创建与src同类型和大小的矩阵(dst)
dstImage = np.zeros(srcImage.shape, np.uint8) * 0
# 【2】将原图像转换为灰度图像
grayImage = cv2.cvtColor(srcImage, cv2.COLOR_BGR2GRAY)
# 【3】先用使用3x3内核来降噪(均值滤波)
edge = cv2.blur(grayImage, (3, 3))
# 【4】运行Canny算子
edge = cv2.Canny(edge, 3, 9, 3)
# Using the 'NOT' way
# dstImage=cv2.bitwise_not(dstImage, srcImage1, edge)
# Using the 'copyto' way
edge = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
np.copyto(dstImage, srcImage1, where=np.array(edge, dtype='bool'))
# 【6】显示效果图
cv2.imshow('dstImage.png', dstImage)
cv2.waitKey(0)
cv2.destroyAllWindows()