1. 程式人生 > 實用技巧 >6.邊緣提取--Max-Min

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; } }