常用的边缘检测滤波器

常用的边缘检测滤波器


使用常见的边缘检测滤波器( 3 × 3 3\times3 3×3)大小,对fate.jpeg进行图像处理。

MAX- MIN滤波器:

边缘检测用于检测图像中的线。通常这样提取图像中的信息的操作被称为特征提取
MAX-MIN滤波器是一种常见的边缘检测滤波器,其使用网格内像素的最大值和最小值的差值对网格内像素重新赋值。

边缘检测通常在灰度图像上进行。

MAX-MIN滤波器:

// max_min_filter
cv::Mat max_min_filter(cv::Mat img, int kernel_size)
{
   
    int row = img.rows;
    int col = img.cols;
    int channel = img.channels();

    cv::Mat new_image = cv::Mat::zeros(row, col, CV_8UC1);

    int pad = floor(kernel_size / 2);

    double max_val = 0, min_val = 10000, val = 0;
    for (int i = 0; i < row; i++)
    {
   
        for (int j = 0; j < col; j++)
        {
   
            max_val = 0;
            min_val = 10000;
            for (int di = -pad; di < pad + 1; di++) {
   
                for (int dj = -pad; dj < pad + 1; dj++) {
   
                    if (((di + i) >= 0) && ((di + i) < row) && ((dj + j) >= 0) && ((dj + j) < col)) {
   
                        val = img.at<uchar>(i + di, j + dj);
                    }
                    if (val > max_val) {
   
                        max_val = val;
                    }
                    if (val < min_val) {
   
                        min_val = val;
                    }
                }
            }
            new_image.at<uchar>(i, j) = (uchar)(max_val - min_val);
        }
    }

    return new_image;
}
输入图像 (fate.jpeg) MAX-MIN滤波图像 (fate_max_min.jpeg)
在这里插入图片描述 在这里插入图片描述

差分滤波器

差分滤波器对图像亮度急剧变化的边缘有提取效果,可以获得邻接像素的差值。

纵向:
K = [ 0 − 1 0 0 1 0 0 0 0 ] K=\left[ \begin{matrix} 0&-1&0\\ 0&1&0\\ 0&0&0 \end{matrix} \right] K= 000110000
横向:
K = [ 0 0 0 − 1 1 0 0 0 0 ] K=\left[ \begin{matrix} 0&0&0\\ -1&1&0\\ 0&0&0 \end{matrix} \right] K= 010010000

// diff_filter
cv::Mat diff_filter(cv::Mat img, int kernel_size, bool horizontal)
{
   
    int row = img.rows;
    int col = img.cols;

    cv::Mat new_image = cv::Mat::zeros(row, col, CV_8UC1);

    int pad = floor(kernel_size / 2);
    int kernel[3][3] = {
   {
   0, -1, 0}, {
   0, 1, 0}, {
   0, 0, 0}};

    if (horizontal)
    {
   
        kernel[0][1] = 0;
        kernel[1][0] = -1;
    }

    double val = 0;
    for (int i = 0; i < row; i++)
    {
   
        for (int j = 0; j < col; j++)
        {
   
            val = 0;
            for (int di = -pad; di < pad + 1; di++)
            {
   
                for (int dj = -pad; dj < pad + 1; dj++)
                {
   
                    if (((di + i) >= 0) && ((di + i) < row) && ((dj + j) >= 0) && ((dj + j) < col))
                    {
   
                        val += img.at<uchar>(i + di, j + dj) * kernel[di + pad][dj + pad];
                    }
                }
            }
            val = fmax(val, 0);
            val = fmin(val, 255);
            new_image.at<uchar>(i, j) = (uchar)val;
        }
    }

    return new_image;
}
输入图像 (fate.jpeg) 纵向滤波图像 (fate_diff_v.jpeg) 横向滤波图像 (fate_diff_h.jpeg)
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

Sobel滤波器

Sobel滤波器可以提取特定方向(纵向或横向)的边缘,滤波器按下式定义:

纵向:
K = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] K=\left[ \begin{matrix} 1&2&1\\ 0&0&0\\ -1&-2&-1 \end{matrix} \right] K=

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值