前言
在数字图像处理中,矩阵掩膜(或卷积核)是一个关键概念,它通过在图像的每个像素上应用特定的操作来实现各种效果,如模糊、锐化和边缘检测等。在 OpenCV 中,使用矩阵掩膜可以轻松实现这些操作,并对图像进行定制化的处理。在这篇博客中,我们将介绍矩阵掩膜的基本原理,并通过 C++ 代码示例,展示如何在 OpenCV 中应用矩阵掩膜进行图像处理。如有错误请多多包涵。
矩阵掩膜
矩阵掩膜,也称为卷积核或滤波器,是一个小的、通常为正方形的矩阵。这个矩阵在图像上进行移动,并在每个位置与图像的对应区域进行逐元素乘积运算,然后将结果进行求和,得到新的像素值。通过这种操作,矩阵掩膜可以在图像中实现各种效果,如模糊、锐化和边缘检测等。
在 OpenCV 中,可以使用 cv::filter2D
函数来应用矩阵掩膜。该函数允许你指定一个卷积核,并将其应用到图像上,从而产生新的处理后的图像。
1.读取图像
图片链接实验图片下载链接
先读取图像用于后面的操作
Mat src, dst;
src = imread("sherlock.jpg");
if (!src.data) {
printf("could not find the image...\n");
return;
}
namedWindow("input image", cv::WINDOW_AUTOSIZE);
cv::imshow("input image", src);
2.创建卷积核
(1)模糊核:这里定义了一个 3x3 的模糊核,每个元素的值均为 1/9
。这种核用于对图像进行平均模糊处理。
Mat blur_kernel = (cv::Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
(2)锐化核:锐化核是一个常用于增强图像边缘的矩阵,它能够突出图像中的细节。
cv::Mat sharpen_kernel = (cv::Mat_<float>(3, 3) <<
0, -1, 0,
-1, 5, -1,
0, -1, 0);
3.应用掩膜并显示结果
filter2D
:用于对图像应用卷积操作。将定义的卷积核(即矩阵掩膜)应用到图像上,从而执行滤波操作。
filter2D(src, dst, -1, blur_kernel);
namedWindow("blur image", cv::WINDOW_AUTOSIZE);
cv::imshow("blur image", dst);
filter2D(src, dst, -1, sharpen_kernel);
namedWindow("sharpen image", cv::WINDOW_AUTOSIZE);
cv::imshow("sharpen image", dst);
锐化图像 result
完整代码
#include<opencv2/opencv.hpp>
#include<highgui.hpp>
using namespace cv;
using namespace std;
void matrix_mask()
{
Mat src, dst;
src = imread("sherlock.jpg");
if (!src.data) {
printf("could not find the image...\n");
return;
}
namedWindow("input image", cv::WINDOW_AUTOSIZE);
cv::imshow("input image", src);
//模糊核 图像平滑,细节减少
Mat blur_kernel = (cv::Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;
//锐化核 边缘突出,细节更加清晰
Mat sharpen_kernel = (cv::Mat_<float>(3, 3) <<
0, -1, 0,
-1, 5, -1,
0, -1, 0);
filter2D(src, dst, -1, blur_kernel); // 应用掩膜并显示结果
namedWindow("blur image", cv::WINDOW_AUTOSIZE);
cv::imshow("blur image", dst);
filter2D(src, dst, -1, sharpen_kernel);
namedWindow("sharpen image", cv::WINDOW_AUTOSIZE);
cv::imshow("sharpen image", dst);
waitKey(0);
}
int main()
{
matrix_mask();
return 0;
}