zoukankan      html  css  js  c++  java
  • Opencv 图像平滑基础二维离散卷积C++ API

    //实现same卷积
    # include <opencv2corecore.hpp>
    # include <opencv2highguihighgui.hpp>
    # include<opencv2imgprocimgproc.hpp>
    # include <iostream>
    using namespace std;
    using namespace cv;
    template<class T>
    void printMat(Mat matrix)
    {
    	for (int r = 0; r < matrix.rows; r++)
    	{
    		for (int c = 0; c < matrix.cols; c++)
    		{
    			if (typeid(T) == typeid(uchar)) {
    				cout << (int)(matrix.at<T>(r, c)) << ",";
    			}
    			else
    			{
    				cout << (matrix.at<T>(r, c)) << ",";
    			}
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    template<class T>
    void printMatT(Mat matrix)
    {
    	for (int r = 0; r < matrix.rows; r++)
    	{
    		for (int c = 0; c < matrix.cols; c++)
    		{
    			cout << (matrix.at<T>(r, c)) << ",";
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    void conv2D(InputArray src, InputArray kernel, OutputArray dst, int ddepth, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT)
    {
    	//卷积运算第一步:卷积核逆时针反转180度
    	Mat kernelFlip;
    	flip(kernel, kernelFlip, -1);
    	//卷积运算第二步
    	filter2D(src, dst, ddepth, kernelFlip, anchor, 0.0, borderType);
    }
    //可分离的离散二维卷积
    void sepConv2D_Y_X(InputArray src, OutputArray src_kerY_kerX, int ddepth, InputArray kernelY, InputArray kernelX, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT)
    {
    	//输入矩阵与垂直方向上的卷积核的卷积
    	Mat src_kerY;
    	conv2D(src, kernelY, src_kerY, ddepth, anchor, borderType);
    	//和水平方向的卷积核卷积
    	conv2D(src_kerY, kernelX, src_kerY_kerX, ddepth, anchor, borderType);
    }
    int main()
    {
    	Mat I = (Mat_<float>(2, 2) << 1, 2, 3, 4);
    	Mat K = (Mat_<float>(2, 2) << -1, -2, 2, 1);
    	Mat c_same;
    	conv2D(I, K, c_same, CV_32FC1, Point(0, 0), BORDER_CONSTANT);
    	printMatT<float>(c_same);
    	//输入矩阵
    	Mat src = (Mat_<float>(5, 5) << 1, 2, 3, 10, 12,
    		32, 43, 12, 4, 190,
    		12, 234, 78, 0, 12,
    		43, 90, 32, 8, 90,
    		71, 12, 4, 98, 123);
    	//卷积核
    	Mat kernel = (Mat_<float>(3, 3) << 1, 0, -1, 1, 0, -1, 1, 0, -1);
    	//same 卷积
    	Mat c_same1;
    	conv2D(src, kernel, c_same1, CV_32FC1, Point(-1, -1), 4);
    	printMatT<float>(c_same1);
    	//利用卷积核的分离特性计算
    	Mat kernel1 = (Mat_<float>(1, 3) << 1, 0, -1);
    	Mat kernel2 = (Mat_<float>(3, 1) << 1, 1, 1);
    	Mat c_same2;
    	sepConv2D_Y_X(src, c_same2, CV_32FC1, kernel1, kernel2);
    	printMatT<float>(c_same2);
    
    }
    
  • 相关阅读:
    基础字段及选项2(11)
    模型层及ORM介绍(9)
    Luogu [P3367] 模板 并查集
    Luogu [P1958] 上学路线_NOI导刊2009普及(6)
    Luogu [P3951] 小凯的疑惑
    Luogu [P2708] 硬币翻转
    Luogu [P1334] 瑞瑞的木板(手写堆)
    一步步学习如何建立自己的个性博客~~
    Android初学者—listView用法
    SQLite命令—对表插入和修改等操作
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860125.html
Copyright © 2011-2022 走看看