1. 程式人生 > >opencv2—(4)遍歷影象和鄰域操作

opencv2—(4)遍歷影象和鄰域操作

在影象處理中,對當前位置畫素的相鄰畫素計算新的畫素值是很常見的操作,當鄰域包括影象的前幾行和下幾行時,你就需要同時掃描影象的若干行 本篇介紹的這個例子是對影象進行銳化,它是基於拉普拉斯運算元的。將一幅影象減去它經過拉普拉斯濾波之後的影象,這幅影象的邊緣部分得到放大,即細節部分得到銳化,這個銳化的運算元計算方式如下: sharpened——pixel=5*current-left-right-up-down; //彩色圖片銳化 void sharpend(const Mat& image, Mat& result) { result.create(image.size(), image.type()); for (int j = 1; j < image.rows-1; j++)        { const uchar* previous = image.ptr<const uchar>(j - 1); const uchar* current = image.ptr<const uchar>(j); const uchar* next = image.ptr<
const uchar>(j + 1); uchar* output = result.ptr<uchar>(j); for (int i = 1* image.channels(); i < (image.cols-1)*image.channels(); i++)               {                      output[i] = cv::saturate_cast<uchar>                                 (5 * current[i] - previous[i]-current[i-3]-current[i+3]-next[i]);
              }        } result.row(0).setTo(cv::Scalar(0,0,0)); result.row(result.rows-1).setTo(cv::Scalar(0,0,0)); result.col(0).setTo(cv::Scalar(0,0,0)); result.col(result.cols - 1).setTo(cv::Scalar(0,0,0)); } 其中模板函式cv::saturate_cast用來對計算結果進行截斷;cv::Scalar(0,0,0)指定畫素的三個通道的目標值 當然,對於本例子中的銳化濾波器,核矩陣為:[ 0 -1 0; -1 5 -1; 0 -1 1]這樣一個3*3 的矩陣,OpenCV定義了一個特殊的函式來完成濾波處理:
cv::filter2D 下面是本例的第二種實現方法: void sharpen2D(const Mat& image, Mat& result) { Mat kernel(3, 3, CV_32F, cv::Scalar(0));        kernel.at<float>(1, 1) = 5.0;        kernel.at<float>(0, 1) = -1.0;        kernel.at<float>(1, 0) = -1.0;        kernel.at<float>(1, 2) = -1.0;        kernel.at<float>(2, 1) = -1.0;        cv::filter2D(image, result, image.depth(), kernel); }