opencv2—(4)遍歷影象和鄰域操作
阿新 • • 發佈:2019-01-27
在影象處理中,對當前位置畫素的相鄰畫素計算新的畫素值是很常見的操作,當鄰域包括影象的前幾行和下幾行時,你就需要同時掃描影象的若干行
本篇介紹的這個例子是對影象進行銳化,它是基於拉普拉斯運算元的。將一幅影象減去它經過拉普拉斯濾波之後的影象,這幅影象的邊緣部分得到放大,即細節部分得到銳化,這個銳化的運算元計算方式如下:
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);
}