一、算法原理
图像的细节属于低频信息,图像的边缘属于高频信息。我们使用一定大小的 Max-Min 滤波器作用于图像,当滤波器作用于图像细节时,输出结果往往趋向于0(黑色);而滤波器作用于图像边缘时,Max-Min 输出结果往往趋向于255(白色)。
所以 最大-最小滤波器 能有效地用于检测图像的边缘和轮廓。
二、算法实现
const int kernel = 3; Mat MaxMinEdge(Mat& img) { if (img.data) { int height = img.rows; int width = img.cols; Mat gray_image = Mat::zeros(height, width, CV_8UC1); for(int i = 0; i < height;i++) { for (int j = 0; j < width; j++) { gray_image.at<uchar>(i,j) = 0.2126 * (float)img.at<cv::Vec3b>(i, j)[2] + 0.7152 * (float)img.at<cv::Vec3b>(i,j)[1] + 0.0722 * (float)img.at<cv::Vec3b>(i, j)[0]; } } imshow("gray image ", gray_image); Mat edge = Mat::zeros(height, width, CV_8UC1); int max = 0, min = 999; int pad = floor(kernel/2); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { max = 0; min = 999; for (int y = -pad; y < pad + 1; y++) { for (int x = -pad; x < pad + 1; x++) { if (((i + y) < height) && ((x + j) < width)&& ((i-pad) > 0) && ((j -pad) > 0)) { if (max < (int)gray_image.at<uchar>(i + y, j + x)) max = (int)gray_image.at<uchar>(i + y, j + x); if (min > (int)gray_image.at<uchar>(i + y, j + x)) min = (int)gray_image.at<uchar>(i + y, j + x); } } } edge.at<uchar>(i, j) = (uchar)(max - min); } } return edge; } }