常用的边缘检测滤波器
使用常见的边缘检测滤波器( 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=
000−110000
横向:
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=
0−10010000
// 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=