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; }