基于拉普拉斯算子的图像锐化
2019-07-13 20:45发布
生成海报
- 对于求一个锐化后的像素点(sharpened_pixel),这个基于拉普拉斯算子的简单算法主要是遍历图像中的像素点,根据领域像素确定其锐化后的值
- 计算公式:sharpened_pixel = 5 * current – left – right – up – down ;
见下图:
当一个运算是通过领域像素进行的时候,我们通常用一个矩阵来表示这种运算关系,也就是我们经常所说的 核
(Kernel) 。那么上面的 锐化滤波器 (Sharpening Filter) 就可以用这个矩阵表示为它的核:
因为 滤波 在图像处理中是一个非常普通且常用的操作,所以OpenCV里面已经定义了一个特殊的函数用来执行这个操作。要使用它的话只需要定义一个 核 ,然后作为参数传递就行了。
[cpp] view
plaincopy
-
-
void sharpenImage1(const Mat &image, Mat &result)
-
{
-
result.create(image.size(),image.type());
-
-
-
-
-
-
for(int i=1; i
-
{
-
const uchar * pre = image.ptr<const uchar>(i-1);
-
const uchar * cur = image.ptr<const uchar>(i);
-
const uchar * next = image.ptr<const uchar>(i+1);
-
uchar * output = result.ptr(i);
-
int ch = image.channels();
-
int startCol = ch;
-
int endCol = (image.cols-1)* ch;
-
for(int j=startCol; j < endCol; j++)
-
{
-
-
-
考虑到图像的通道数
-
-
*output++ = saturate_cast(5*cur[j]-pre[j]-next[j]-cur[j-ch]-cur[j+ch]);
-
}
-
}
-
-
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));
-
-
-
-
-
-
}
-
-
-
void sharpenImage2(const Mat &image, Mat &result)
-
{
-
Mat kernel = (Mat_<float>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
-
filter2D(image,result,image.depth(),kernel);
-
}
-
-
-
void main(){
-
Mat mat = imread("images/lena.jpg");
-
Mat result1;
-
Mat result2;
-
-
sharpenImage1(mat,result1);
-
sharpenImage2(mat,result2);
-
-
namedWindow("src");
-
namedWindow("result1");
-
namedWindow("result2");
-
imshow("src",mat);
-
imshow("result1",result1);
-
imshow("result2",result2);
-
}
结果:
原图
手动实现
调用OpenCV中函数实现
参考文章地址:
http://ggicci.blog.163.com/blog/static/210364096201262123236955/
http://www.cnblogs.com/liu-jun/archive/2012/08/12/2635373.html
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮