原文链接:OpenCV--矩阵的掩膜操作
我的实验代码
法1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; int main(int argc, char **argv) { Mat src, dst; src = imread("./girl.jpg"); if (!src.data) { std::cout << "Could not load image... " << std::endl; return -1; } namedWindow("Girl", CV_WINDOW_AUTOSIZE); imshow("Girl",src); int cols = src.cols*src.channels(); int offsetx = src.channels(); int rows = src.rows; dst = Mat::zeros(src.size(), src.type()); double t = getTickCount(); for (int row=1; row < rows - 1; row++) { const uchar* current = src.ptr<uchar>(row); const uchar* previous = src.ptr<uchar>(row - 1); const uchar* nest = src.ptr<uchar>(row + 1); uchar* output = dst.ptr<uchar>(row); for (int col = offsetx; col < cols; col++) { output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + nest[col])); } } double timeconsume = (getTickCount() - t) / getTickFrequency(); std::cout << "耗时:" << timeconsume << std::endl; namedWindow("Girl After", CV_WINDOW_AUTOSIZE); imshow("Girl After", dst); waitKey(0); return 0; }
法2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; int main(int argc, char **argv) { Mat src, dst; src = imread("./girl.jpg"); if (!src.data) { std::cout << "Could not load image... " << std::endl; return -1; } namedWindow("Girl", CV_WINDOW_AUTOSIZE); imshow("Girl",src); int cols = src.cols*src.channels(); int offsetx = src.channels(); int rows = src.rows; dst = Mat::zeros(src.size(), src.type()); double t = getTickCount(); Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(src, dst, src.depth(), kernel); double timeconsume = (getTickCount() - t) / getTickFrequency(); std::cout << "耗时:" << timeconsume << std::endl; namedWindow("Girl After", CV_WINDOW_AUTOSIZE); imshow("Girl After", dst); waitKey(0); return 0; }