转载:
https://blog.csdn.net/qq_18649781/article/details/86484827
引言:
在图像处理领域有一个众所周知的结论:如果从图像中减去拉普拉斯算子部分,图像的边缘就会放大,因而图像会变的更加尖锐。 在这里基于拉普拉斯算子,通过访问图像中相邻像素来实现对图像的锐化
1、锐化原理公式
5*current[i] - current[i-nchannels] - current[i+nchannels]-previous[i]-next[i]);
2、第一种实现方式:通过访问相邻像素实现对图像的锐化
void sharpen(const Mat &image,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); /// 输出行
/**** 应用锐化算子操作部分 ****/
在这里,将每个像素的三个通道,合并成一个 矩阵,所以这里有 (image.cols-1)*nchannels 这个操作
/// 需要注意一点的是: 对于彩色图片,当三个通道的时候,一定是BGR对应颜色像素进行操作,所以这里是 current[i-nchannels]和current[i+nchannels]
for (int i = nchannels; i < (image.cols-1)*nchannels; i++) { /// 循环三个通道,进行相应的处理
*output++ = saturate_cast<uchar>(
5*current[i] - current[i-nchannels] - current[i+nchannels]-previous[i]-next[i]); /// 该值的5倍 减去 上下左右四个数
}
}
/// 接下来将未处理的像素都设为0
result.row(0).setTo(Scalar(0));
result.row(result.rows -1).setTo(Scalar(0));
result.col(0).setTo(Scalar(0));
result.col(result.cols-1).setTo(Scalar(0));
imshow("HAHAH1",result);
}
3、第二种实现方式:基于OpenCV专门定于的 filter2D( )函数
void sharpen2D(const Mat &image,Mat &result)
{
// 首先构造一个内核
Mat kernel(3,3,CV_32F,Scalar(0));
/// 对 对应内核进行赋值
kernel.at<float>(1,1) = 5.0;
kernel.at<float>(0,1) = -1.0;
kernel.at<float>(2,1) = -1.0;
kernel.at<float>(1,0) = -1.0;
kernel.at<float>(1,2) = -1.0;
// 同样可以直接构造内核
// lap_5 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
// lap_9 = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
/// 对图像进行滤波操作
filter2D(image,result,image.depth(),kernel);
imshow("HAHAH2",result);
}