图像处理实验3:空域滤波 您所在的位置:网站首页 图像滤波结果分析报告模板 图像处理实验3:空域滤波

图像处理实验3:空域滤波

2024-07-17 21:19| 来源: 网络整理| 查看: 265

要求 利用均值模板平滑灰度图像。 具体内容:利用 OpenCV 对图像像素进行操作,分别利用 33. 55 和 9*9 尺寸的均值模板平滑灰度图像利用高斯模板平滑灰度图像。 具体内容:利用 OpenCV 对图像像素进行操作,分别利用 33. 55 和 9*9 尺寸的高斯模板平滑灰度图像利用 Laplacian. Robert. Sobel 模板锐化灰度图像。 具体内容:利用 OpenCV 对图像像素进行操作,分别利用 Laplacian. Robert. Sobel 模板锐化灰度图像利用高提升滤波算法增强灰度图像。 具体内容:利用 OpenCV 对图像像素进行操作,设计高提升滤波算法增 强图像利用均值模板平滑彩色图像。 具体内容:利用 OpenCV 分别对图像像素的 RGB 三个通道进行操作,利 用 33. 55 和 9*9 尺寸的均值模板平滑彩色图像利用高斯模板平滑彩色图像。 具体内容:利用 OpenCV 分别对图像像素的 RGB 三个通道进行操作,分 别利用 33. 55 和 9*9 尺寸的高斯模板平滑彩色图像利用 Laplacian. Robert. Sobel 模板锐化灰度图像。 具体内容:利用 OpenCV 分别对图像像素的 RGB 三个通道进行操作,分 别利用 Laplacian. Robert. Sobel 模板锐化彩色图像 过程

我没有严格按照要求做,事实上,我增加了些。

向量

可使用vector存储要使用的参数。

在使用vector存储函数时,遇到了些麻烦。gaussian_kernel有3个参数,而vector被我设置成元素为function>,使用bind将gaussian_kernel转化成符合要求的函数对象(仿函数)即可。

我之前错误的做法是,又另外实现了满足条件的只需要接受Mat&,int两个参数的gaussian_kernel函数,函数重载。但编译器似乎不知道该使用哪一个gaussian_kernel函数了

opencv的矩阵运算

opencv的矩阵运算支持多通道Mat,所以我之前将彩色图像split后处理再merge的做法反而多余了。

当需要对不同通道做不同处理时,这时就需要split–>process–>merge处理流程了。

Robert算子

一般见到的Robert算子是2×2的,但一般卷积核大小为奇数,所以可把2*2的卷积核放到3×3的右下方。

解耦

在实验1时,我把公共部分抽象成一个公共函数,供各个函数调用。

在此次实验中,我把参数和处理函数(回调函数)分别放到不同的vector。将公共处理部分在主函数的for循环中,主动调用vector中的函数和参数。

代码 #include #include #include #include #include #include #include #include using namespace cv; using namespace std; void mean_kernel(Mat &kernel, int ksize); void gaussian_kernel(Mat &kernel, int ksize, double sigma=0.849); vector ksizes {3, 5, 9}; vector smooth_kernel_names {"Mean", "Gauss"}; vector smooth_kernel_fun {mean_kernel, bind(gaussian_kernel, placeholders::_1, placeholders::_2, 1.)}; vector diff_kernel_names {"Laplace", "Sobel", "Robert",}; vector kernel_weights0 {{0,-1,0,-1,4,-1,0,-1,0}, {-1,-2,-1,0,0,0,1,2,1}, {0,0,0,0,-1,0,0,0,1}}; vector kernel_weights1 {{0,-1,0,-1,4,-1,0,-1,0}, {-1,0,1,-2,0,2,-1,0,1}, {0,0,0,0,0,-1,0,1,0}}; void mean_kernel(Mat &kernel, int ksize) { kernel = Mat::ones(ksize, ksize, CV_32F) / (float)(ksize * ksize); } void gaussian_kernel(Mat &kernel, int ksize, double sigma) { kernel.create(ksize, ksize, CV_32F); auto fun = [=](float x, float y) -> float { return exp((-x*x-y*y) / (2*sigma*sigma))/ (2 * CV_PI * sigma * sigma);}; for (int i = 0; i p[j] = fun(j-(ksize-1)/2, i-(ksize-1)/2); // p[j] = fun(j-ksize/2, i-ksize/2); } } auto weight_sum = cv::sum(kernel); cv::divide(kernel, Mat(ksize, ksize, kernel.type(), weight_sum), kernel); } int main(int argc, char const *argv[]) { const char *image_path = (argc > 1) ? argv[1] : "img_test.jpg"; Mat img, image_color, image_gray, image_dst; img = imread(image_path, IMREAD_COLOR); if (img.empty()) { cout "image_color", image_color}}; for (auto &item : images) { auto image_name = item.first; auto image = item.second; cout Mat kernel, image_diff; smooth_kernel_fun[i](kernel, ksizes[j]); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有