將一副圖像減去經(jīng)過拉普拉斯濾波滯后的圖像,,這幅圖像的邊緣部分將得到放大,,計(jì)算公式如下:
濾波后的像素值=5*中-左-右-上-下:
轉(zhuǎn)自:http://blog.csdn.net/devil_pull/article/details/17246855
- /**
- * @file 2_6.cpp
- * @Synopsis 圖像銳化,拉普拉斯算子
- * @author weih.cao
- * @version 1.0.0.0
- * @date 2013-12-10
- */
- #include<opencv2/core/core.hpp>
- #include<opencv2/imgproc/imgproc.hpp>
- #include<opencv2/highgui/highgui.hpp>
-
- /* --------------------------------------------------------------------------*/
- /**
- * @Synopsis sharpen
- *
- * @Param image
- * @Param result
- */
- /* ----------------------------------------------------------------------------*/
- void sharpen(const cv::Mat image, cv::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; i < image.cols-1; i++)
- {
- //sharpened_pixel = 5*current-left-right-up-down;
- //cv::saturate_cast用以對(duì)計(jì)算結(jié)果進(jìn)行截?cái)啵?-255)
- *output++ = cv::saturate_cast<uchar>(
- 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));
- }
-
- int main(int argc,char** argv)
- {
- cv::Mat img = cv::imread(argc == 2 ? argv[1] : "lena.jpg");
- cv::cvtColor(img,img,CV_BGR2GRAY);
- cv::Mat result;
- result.create(img.size(), img.type());
- sharpen(img, result);
- cv::namedWindow("sharpen");
- cv::namedWindow("img");
- cv::imshow("img",img);
- cv::imshow("sharpen", result);
- cv::waitKey(0);
- }
注:
1.cv::saturate_cast被用來對(duì)計(jì)算結(jié)果進(jìn)行截?cái)?,?duì)數(shù)值的數(shù)學(xué)計(jì)算常常超出允許的計(jì)算范圍,,解決方案是直接映射到0~255.
2.row和col方法,。返回一個(gè)特殊的,、僅包含一行或一列的cv::Mat實(shí)例。在這個(gè)過程中沒任何形式的數(shù)據(jù)拷貝,,如果該一維矩陣遭到修改也會(huì)相應(yīng)的修改原始圖像,。
3.setTo函數(shù)將矩陣的所有元素設(shè)為指定的值,。
- result.row(0).setTo(cv::Scalar(0));
將圖像的第一行的所有像素設(shè)置為0,。三通道的愛色圖像,需要使用cv::Scalar(a,b,c)來指定像素三個(gè)通道的目標(biāo)值,。
效果圖:
|