准备工作
它基于拉普拉斯算子(将在第6章中讨论)。在图像处理领域有一个众所周知的结论:如果从图像中减去拉普拉斯算子部分,图像的边缘就会放大,因而图像会变得更加尖锐。
用以下方法计算锐化的数值:
sharpened_pixel= 5*current-left-right-up-down;
如何实现
图像扫描中
使用了三个指针,一个表示当前行,一个表示上面的行,另外一个表示下面的行。另外,在计算每一个像素时都需要访问与它相邻的像素,因此有些像素的值是无法计算的,包括第一行、最后一行、第一列、最后一列的像素。
这个循环可以这样写:
void sharpen(const cv::Mat &image, cv::Mat &result) {
// 判断是否需要分配图像数据。如果需要,就分配
result.create(image.size(), image.type());
int nchannels= image.channels(); // 获得通道数
// 处理所有行(除了第一行和最后一行)
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=nchannels; i<(image.cols-1)*nchannels; i+