//打开指定路径下的一幅图像
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);
原图:
最终效果图:
未减去拉升后最低灰度值时的效果图: