【数字图像处理】实现拉普拉斯锐化

来源:互联网 发布:51网络技术论坛 编辑:程序博客网 时间:2024/06/03 19:39
//打开指定路径下的一幅图像Mat src = imread("E:\\学习之路\\OpenCV 练习程序\\Fig0316(a)(moon).tif",0);if(!src.data){cout << "打开图像失败" << endl;return ;}//创建一幅图像,用以保存经过拉普拉斯锐化最终的效果图像Mat dst = src.clone();//创建一幅用于保存拉普拉斯处理后的子图像Mat lap;lap.create(src.size(),src.type());vector<int> table;//将每个像素使用3*3掩模处理for(int r = 1;r < src.rows - 1;r++){const uchar* up = src.ptr<uchar>(r + 1);const uchar* mid = src.ptr<uchar>(r);const uchar* down = src.ptr<uchar>(r - 1);for(int c = 1;c < src.cols - 1;c++){int sum = 0;for(int i = -1;i < 2;i++){if(i == 0)sum = sum + 8 * mid[c + i] - up[c + i] - down[c + i];else{sum = sum - up[c + i] - mid[c + i] - down[c + i];}}table.push_back(sum);}}int max = 0;int min = 0;//计算得出经过处理后的像素最大值,以及最小值for(int i = 0;i < table.size();i++){if(max < table[i]){max = table[i];}if(min > table[i])min = table[i];}int index = 0;//将对比拉升后的图像保存至lap中for(int i = 1;i < lap.rows - 1;i++){uchar* data = lap.ptr<uchar>(i);for(int c = 1;c < lap.cols - 1;c++){data[c] = (uchar)(255 * ((table[index++] - min) * 1.0 / (max - min)));}}//将拉普拉斯处理图像与原图像混合叠加,得到最终效果图for(int r = 1;r < lap.rows;r++){uchar* data = dst.ptr<uchar>(r);uchar* tmp = lap.ptr<uchar>(r);for(int c = 1;c < lap.cols;c++){//要减去拉升时得到的最小灰度值,否则会造成图像整体灰度值增加int tmp1 = (int)data[c] + (int)tmp[c] - (255 * ((0 - min) * 1.0 / (max - min)));if(tmp1 > 255)tmp1 = 255;else if(tmp1 < 0)tmp1 = 0;data[c] = (uchar)tmp1;}}imshow("原图",src);imshow("laplace锐化",dst);waitKey(0);

原图:


最终效果图:


未减去拉升后最低灰度值时的效果图:


原创粉丝点击