1. 程式人生 > >【OpenCV】矩陣掩模操作

【OpenCV】矩陣掩模操作

  矩陣掩模操作是指根據一個掩碼矩陣(也稱為核心kernel)重新計算影象中每個畫素的值。掩碼可以控制改變相鄰畫素和當前畫素對新畫素值的影響,從而產生新的影象畫素。

  本節通過影象銳化來比較影象指標運算與掩模操作的執行結果,觀察執行時間的差異。

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace
cv; void sharpen(const Mat& myImage, Mat& Result); int main(int argc, char* grav[]) { char* filename = "../data/fruits.jpg"; Mat src, dst0, dst1; src = imread(filename, IMREAD_COLOR); if (src.empty()) { // cerr(無緩衝標準錯誤):沒有緩衝,傳送給它的內容立即被輸出 cerr
<< "Can't open image" << endl; return -1; } namedWindow("Input", WINDOW_AUTOSIZE); namedWindow("Output", WINDOW_AUTOSIZE); imshow("Input", src); // 顯示原影象 double t = (double)getTickCount(); // 計算hand-coded方法的時間
sharpen(src, dst0); t = ((double)getTickCount() - t) / getTickFrequency(); cout << "Hand written function time passed in seconds:" << t << endl; imshow("Output", dst0); Mat kernel = (Mat_<char>(3, 3) << 0,-1,0,-1,5,-1,0,-1,0); t = (double)getTickCount(); // 計算矩陣掩模方法的時間 filter2D(src, dst1, src.depth(), kernel); // 濾波filter2D函式 t = ((double)getTickCount() - t) / getTickFrequency(); cout << "Built-in filter2D time passed in seconds:" << t << endl; imshow("Output", dst1); waitKey(0); return 0; } void sharpen(const Mat& myImage, Mat& Result) { CV_Assert(myImage.depth() == CV_8U); // 只允許uchar型影象 const int nChannels = myImage.channels(); Result.create(myImage.size(), myImage.type()); for (int j = 1; j < myImage.rows - 1; ++j) // 遍歷影象 { const uchar* previous = myImage.ptr<uchar>(j - 1); const uchar* current = myImage.ptr<uchar>(j); const uchar* next = myImage.ptr<uchar>(j + 1); uchar* output = Result.ptr<uchar>(j); for (int i = nChannels; i < nChannels*(myImage.cols - 1); ++i) { // saturate_cast原理: if(data<0) data = 0; if (data>255) data = 255 *output++ = saturate_cast<uchar>(5 * current[i] // 防止資料溢位 - current[i - nChannels] - current[i + nChannels] - previous[i] - next[i]); } } Result.row(0).setTo(Scalar(0)); // 影象四邊未處理畫素設為0 Result.row(Result.rows - 1).setTo(Scalar(0)); Result.col(0).setTo(Scalar(0)); Result.col(Result.cols - 1).setTo(Scalar(0)); }

執行結果

Hand written function time passed in seconds:0.0174564
Built-in filter2D time passed in seconds:0.00683035