消除噪声。 使用高斯平滑滤波器卷积降噪。 下面显示了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 反射机制浅析