图像锐化处理

图像锐化原理:
下面我们进行一个简单的滤波操作,滤波算子为[0 –1 0;-1 5 –1;0 –1 0],它可以让图像变得尖锐,而边缘更加突出。核心公式即:
sharp(i.j)=5*image(i,j)-image(i-1,j)-image(i+1,j)-image(i,j-1)-image(i,j+1)

 版本一:
图像遍历使用三个指针,一个指向当前行、一个指向前一行、一个指向后一行,由于每个像素值计算都需要它的上下左右四个领域像素值,所以不可能对图像的第一行、最后一行、第一列、最后一列进行计算。具体代码如下:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

void sharpen(Mat& image,Mat& result){
    result.create(image.size(),image.type());
    for(int i=1;i<image.rows-1;i++){
        const uchar* current=image.ptr<const uchar>(i);
        const uchar* previous=image.ptr<const uchar>(i-1);
        const uchar* next=image.ptr<const uchar>(i+1);
        uchar* data_out=result.ptr<uchar>(i);
        for(int j=0;j<image.cols-1;j++){
            if(image.channels()==1)
            {
                data_out[j]=saturate_cast<uchar>(5*current[j]-current[j+1]-current[j-1]-previous[j]-next[j]);
            }
            else if(image.channels()==3)
            {
                *(data_out + j*image.elemSize()) =saturate_cast<uchar>(5 * *(current + j*image.elemSize()) - *(current + (j-1)*image.elemSize())- *(current + (j+1)*image.elemSize()) - *(previous + j*image.elemSize())- *(next + j*image.elemSize()));  
                *(data_out + j*image.elemSize() + 1) = saturate_cast<uchar>(5 * *(current + j*image.elemSize() + 1) - *(current + (j-1)*image.elemSize() + 1)- *(current + (j+1)*image.elemSize() + 1) - *(previous + j*image.elemSize() + 1)- *(next + j*image.elemSize() + 1));  
                *(data_out + j*image.elemSize() + 2) = saturate_cast<uchar>(5 * *(current + j*image.elemSize() + 2) - *(current + (j-1)*image.elemSize() + 2)- *(current + (j+1)*image.elemSize() + 2) - *(previous + j*image.elemSize() + 2)- *(next + j*image.elemSize() + 2));  

            }
        }
        if(image.channels()==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));
        }
        else if(image.channels()==3)
        {
            result.row(0).setTo(Scalar(0,0,0));
            result.row(result.rows-1).setTo(Scalar(0,0,0));
            result.col(0).setTo(Scalar(0,0,0));
            result.col(result.cols-1).setTo(Scalar(0,0,0));

        }
    }
}

int main(){
    Mat image=imread("F:\\opencv_test\\1.jpg",0);
    cout<<image.channels()<<endl;
    Mat result;
    double dur;
    dur=static_cast<double>(getTickCount());
    sharpen(image,result);
    dur=static_cast<double>(getTickCount())-dur;
    dur/=getTickFrequency();
    cout<<dur;

    namedWindow("1");
    imshow("1",result);
    namedWindow("2");
    imshow("2",image);
    waitKey(0);
    return 0;
}
版本二:调用Opencv中定义的函数filter2D完成,在使用它之前需要先定义一个矩阵模版,然后以一副图像和这个模板为参数,返回滤波后的图像;具体代码如下:
int main(){
    Mat kernals(3,3,CV_32F,Scalar(0));
    kernals.at<float>(0,1)=-1.0;
    kernals.at<float>(1,1)=5.0;
    kernals.at<float>(1,0)=-1.0;
    kernals.at<float>(1,2)=-1.0;
    kernals.at<float>(2,1)=-1.0;
    Mat image=imread("F:\\opencv_test\\1.jpg");
    cout<<image.channels()<<endl;

    Mat result;
    filter2D(image,result,image.depth(),kernals);
    namedWindow("1");
    imshow("1",result);
    namedWindow("2");
    imshow("2",image);
    waitKey(0);
    return 0;

}

图像的简单算术运算
(1)注:需要图像的尺寸和类型相同
// c[i]= k1*a[1]+k2*b[i]+k3;
cv::addWeighted(imageA,k1,imageB,k2,k3,resultC);
(2)等价写法:
result= 0.7*image1+0.9*image2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值