式(3.7.1)中的二维拉普拉斯数字实现可由这两个分量相加得到:
从而得到拉普拉斯算子
意思同上面的一阶微分算子相同。
这里解释一下微分算子的使用,很简单,如上面这个就是在处理每个像素点的RGB值时,将该像素的RGB三个值乘以4然后减去他上向左右四个像素点的RGB值,注意R、G、B分别处理。
这样是变化的表示,我们要想图片锐化,应该把这种变化叠加到原像素就行了,也就是
思路很简单。
一下为自己实现图像基于拉普拉斯算子的锐化过程:
void sharpen(const Mat &img, Mat &result)
{
for (int j = 1; j < img.rows - 1; ++j)
{
const uchar *previous = img.ptr(j - 1);
const uchar *current = img.ptr(j);
const uchar *next = img.ptr(j + 1);
uchar *output = result.ptr(j);
for (int i = 1; i < 3 * (img.cols - 1); ++i)//这里是基于RGB图的,如果非RGB图则无需这样
{
*output++ = cv::saturate_cast(
5 * current[i] - current[i - 1] - current[i + 1]
- previous[i] - next[i]);
}
}
result.row(0).setTo(cv::Scalar(0));
result.row(result.rows - 1).setTo(cv::Scalar(0));
result.col(0).setTo(cv::Scalar(0));
result.col(result.cols - 1).setTo(cv::Scalar(0));
}
以下为使用opencv中的fiter2D函数通过拉普拉斯算子实现锐化操作的代码
int main()
{
Mat img, resulta;
img = imread("C:/Users/Administrator/Desktop/bbb.jpg");
cv::Mat kernela(3, 3, CV_32F, cv::Scalar(0));
// assigns kernel values
kernela.at(1, 1) = 5.0;
kernela.at(0, 1) = -1.0;
kernela.at(2, 1) = -1.0;
kernela.at(1, 0) = -1.0;
kernela.at(1, 2) = -1.0;
filter2D(img, resulta, img.depth(), kernela);
//cout << img.rowRange(1, 4).colRange(1, 4) << endl;
//cout << result.rowRange(1, 4).colRange(1, 4) << endl;
imwrite("C:/Users/Administrator/Desktop/solved.jpg", resulta);
//imshow("origin", img);
//imshow("锐化结果", resulta);
waitKey(0);
return 0;
}
原始图片
锐化后图片
欢迎访问本人另一个博客凌风技术站