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

来源:互联网 发布:阴阳师御灵强化数据 编辑:程序博客网 时间:2024/05/16 19:20

                                          遍历图像和领域操作实例——对图像进行锐化

对图像进行锐化,用一幅图像减去它经过拉斯滤波之后的图像,该图像的边缘部分将放大,即细节部分更加锐利,该拉普拉斯算子的计算公式:增强后的像素值=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]);}}//将未处理的像素设置为0result.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  0void Sharpern2D(Mat &img,Mat &result){//初始化3*3的核矩阵为0Mat 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;}

它们两实现的效果一样:

原图:(灰度图)

锐化之后:


0 0
原创粉丝点击