3. 掩模kernel运算

掩模运算表示:在一幅图像中,对某个像素点附近的像素进行矩阵运算,最后获得结果赋值给该像素。掩模运算经常运用sobel算子、Laplace算子等各种求边缘的情况,具有很好的用途。掩模在opencv中被称为kernel,也被称为mask。在opencv中有函数filter2D(src, dst, depth, kernel)用于掩模运算。

说明:depth与type的区别

官方文档对Depth的解释是单独一个通道的类型,通俗的说就是图像中单独一个元素的类型,它可以有以下的类型:

#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_USRTYPE1 7

 

Type是将Depth和通道个数混合在一起的一个类型,所以它的种类比较多:

#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))

#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))

#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))

#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))

#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))

 

代码:

#include "opencv.h"

int main()
{
        string filename = "autum.jpg";
        cv::Mat src, dst;
        src = cv::imread(filename);
        cv::cvtColor(src, src, cv::COLOR_RGB2GRAY);
        cv::Mat kernel = (cv::Mat_<uchar>(3, 3) << 0, 1, 0, -1, 5, -1, 0, -1, 0);//给kernel赋值
        cv::filter2D(src, dst, src.depth(),kernel);
    
        cv::namedWindow("img", 0);
        cv::imshow("img", src);
        cv::namedWindow("otsu", 0);
        cv::imshow("otsu", dst);

        cout << src.depth() << src.type();
    
        cv::waitKey();
        return  0;
    
}

 

posted @ 2019-06-14 10:05  andyalgorithm  阅读(435)  评论(0编辑  收藏  举报