行远-自迩

导航

6.边缘提取--Max-Min

一、算法原理

 

图像的细节属于低频信息,图像的边缘属于高频信息。我们使用一定大小的 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;
    }
}

 

posted on 2020-07-09 18:01  行远-自迩  阅读(309)  评论(0编辑  收藏  举报