您的位置:首页 > 理论基础

学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化

2017-05-13 21:34 656 查看
                                          遍历图像和领域操作实例——对图像进行锐化

对图像进行锐化,用一幅图像减去它经过拉斯滤波之后的图像,该图像的边缘部分将放大,即细节部分更加锐利,该拉普拉斯算子的计算公式:增强后的像素值=5*当前像素-左边像素-右边像素-上方像素-下方像素;

实现方法1如下:

//拉普拉斯算子:用一幅图像减去它经过拉斯滤波之后的图像,该图像的边缘部分将放大,即细节部分更加锐利,
//该拉普拉斯算子的计算公式:增强后的像素值=5*current-left-right-up-down;都是像素运算

void Sharpern1(const Mat &img,Mat &result)
{
//创建一个result存入处理Img之后的图像矩阵
result.create(img.size(),img.type());
for (int j = 1; j < img.rows-1; j++)//处理除了第一行和最后一行之外的所有行
{
const uchar* pre=img.ptr<uchar>(j-1);//上一行的首地址
const uchar* cur=img.ptr<uchar>(j);//当前行首地址
const uchar* next=img.ptr<uchar>(j+1);//下一行
//输出行的首地址
uchar * output=result.ptr<uchar>(j);
//当前行中每列元素(不包括第一列和最后一列)
for (int i = 1; i < img.cols-1; i++)
{
//saturate_cast<uchar>()函数是将()中的值控制中uchar范围0~255之间,超出的截断
*output++=cv::saturate_cast<uchar>(5*cur[i]-pre[i]-next[i]-cur[i-1]-cur[i+1]);

}

}
//将未处理的像素设置为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));
}
实现方法2如下:
//利用Opencv自带的filter2D函数改进上面锐化函数,filter2D函数需要图像,核等作为参数
//需要自己定义一个3*3的核,(大小可以改)
//3*3的核
//   0  -1  0
//  -1  5  -1
//   0  -1  0

void Sharpern2D(Mat &img,Mat &result)
{

//初始化3*3的核矩阵为0
Mat kernel(3,3,CV_32FC1,cv::Scalar(0));
//对核元素进行赋值
kernel.at<float>(1,1)=5.0;
kernel.at<float>(0,1)=-1.0;
kernel.at<float>(1,0)=-1.0;
kernel.at<float>(2,1)=-1.0;
kernel.at<float>(1,2)=-1.0;

//可直接使用Opencv自带的filter2D()函数,前提是要引用imgproc.hpp头文件,关于图像处理的

cv::filter2D(img,result,img.depth(),kernel,Point(-1,-1));
}


以上两个锐化函数,在main()函数中实现如下:

int main()
{
Mat img=imread("img/logo.png",0);
Mat result;
namedWindow("原图像");
imshow("原图像",img);

Sharpern2D(img,result);

if(!result.empty())
{
namedWindow("锐化图像");
imshow("锐化图像",result);
}
waitKey();
return 0;

}


它们两实现的效果一样:

原图:(灰度图)



锐化之后:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: