消除噪声。 使用高斯平滑滤波器卷积降噪。 下面显示了1个size = 5 的高斯内核示例:
计算梯度幅值和方向。 此处,依照Sobel滤波器的步骤:
应用1对卷积阵列 (分别作用于 x 和 y方向):
使用以下公式计算梯度幅值和方向:
梯度方向近似到4个可能角度之1(1般 0, 45, 90, 135)
非极大值 抑制。 这1步排除非边沿像素, 仅仅保存了1些细线条(候选边沿)。
滞后阈值: 最后1步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):
Canny 推荐的 高:低 阈值比在 2:1 到3:1之间。
以上内容摘至参考资料5.《图象边沿检测--OpenCV之cvCanny函数》
Canny
函数原型:
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );
参数说明:
image: 输入图象,需要8位图象。
edges: 输出边沿图象。
threshold1: 第1个滞后阈值。
threshold2: 第2个滞后阈值。
apertureSize:
Sobel算子的孔径大学。
L2gradient
: 计算图象梯度值的标识,1般使用默许值false。
PS:
参数threshold1和threshold2中使用小的1个进行边沿连接,大的用来控制强边沿的初始段,1般比例为2:1至3:1之间。
|
原图
|
处理结果
|
参数
|
threshold1 = 1 threshold2 = 3 apertureSize = 3 L2gradient =false |
#include "opencv2/core/utility.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <stdio.h> using namespace cv; using namespace std; int edgeThresh = 1; Mat image, gray, edge, cedge; // define a trackbar callback static void onTrackbar(int, void*) { blur(gray, edge, Size(3,3)); // Run the edge detector on grayscale Canny(edge, edge, edgeThresh, edgeThresh*3, 3); cedge = Scalar::all(0); image.copyTo(cedge, edge); imshow("Edge map", cedge); } static void help() { printf("\nThis sample demonstrates Canny edge detection\n" "Call:\n" " /.edge [image_name -- Default is ../data/fruits.jpg]\n\n"); } const char* keys = { "{@image |../data/fruits.jpg|input image name}" }; int main( int argc, const char** argv ) { help(); CommandLineParser parser(argc, argv, keys); string filename = parser.get<string>(0); image = imread(filename, 1); if(image.empty()) { printf("Cannot read image file: %s\n", filename.c_str()); help(); return ⑴; } cedge.create(image.size(), image.type()); cvtColor(image, gray, COLOR_BGR2GRAY); // Create a window namedWindow("Edge map", 1); // create a toolbar createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar); // Show the image onTrackbar(0, 0); // Wait for a key stroke; the same function arranges events processing waitKey(0); return 0; }
上一篇 C语言指针,你都了解了吗?
下一篇 Java 反射机制浅析