#include<opencv2/opencv.hpp>
using namespace cv;
void main() {
Mat src = imread("F:/VisualStudioSpace/OpenCV/Resource/Naruto.jpg");
// 拷贝 src 的参数, 创建一个空的 dst;
Mat dst = Mat::zeros(src.size(), src.type());
// 进行掩模操作
uchar *top_pixel, *cur_pixel, *bottom_pixel, *dst_pixel;
int channels = src.channels();
int rows = src.rows;
int cols = src.cols * channels;
// 边缘部分不进行处理
for (int i = 1; i < rows - 1; i++) {
top_pixel = src.ptr(i - 1); // 上一行像素的首地址
bottom_pixel = src.ptr(i + 1); // 下一行像素的首地址
cur_pixel = src.ptr(i); // 当前行像素的首地址
dst_pixel = dst.ptr(i); // 目标输出 Mat 当前行的像素首地址
// 边缘部分不进行处理
for (int j = channels; j < cols - channels; j++) {
/* 均值模糊掩模测试 3 x 3:
dst_pixel = (
top_left + top_center + top_right +
cur_left + cur_right +
bottom_left + bottom_center + botton_right
) / 8
*/
dst_pixel[j] = (
top_pixel[j - channels] + top_pixel[j] + top_pixel[j + channels] +
cur_pixel[j - channels] + cur_pixel[j + channels] +
bottom_pixel[j - channels] + bottom_pixel[j] + bottom_pixel[j + channels]
) / 8;
}
}
imshow("Origin", src);
imshow("Mask", dst);
cvWaitKey(0);
}
#include<opencv2/opencv.hpp>
using namespace cv;
void main() {
Mat src = imread("F:/VisualStudioSpace/OpenCV/Resource/Naruto.jpg");
Mat dst;
// 均值模糊
blur(
src,
dst,
Size(3, 3), // 卷积核大小(需为奇数, 否则卷积相乘之后, 找不到中心点)
Point(-1, -1) // 指定掩模计算之后, 最终作用的像素点, Point(-1, -1) 表示卷积核的中心对应的像素点
);
imshow("blur", dst);
cvWaitKey(0);
}
#include<opencv2/opencv.hpp>
using namespace cv;
void main() {
Mat src = imread("F:/VisualStudioSpace/OpenCV/Resource/Naruto.jpg");
Mat dst;
// 高斯模糊
GaussianBlur(
src,
dst,
Size(15, 15), // 卷积核大小(需为奇数, 否则卷积相乘之后, 找不到中心点)
0, // sigmaX: 传 0 会自己计算: sigmaX = 0.3 * ((kenelSize - 1) * 0.5 - 1) + 0.8
0 // sigmaY: 不传代表和 sigmaX 值相同
);
imshow("Gaussian", dst);
cvWaitKey(0);
}