#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//对图像进行锐化的3种方法
void sharp1(Mat&image,Mat &result);//image0代表原图,image代表结果图。
void sharp2(Mat&image,Mat &result);
void sharp3(Mat&image,Mat &result);
int main()
{
Mat image0 = imread("大教堂.jpg");
resize(image0,image0,Size(),0.4,0.4);//缩放图像为原来的0.4倍。
imshow("原图",image0);
Mat image1;
Mat image2;
Mat image3;
sharp3(image0,image1);
sharp3(image0,image2);
sharp3(image0,image3);
imshow("结果1",image1);
imshow("结果2",image2);
imshow("结果3",image3);
waitKey(0);
return 0;
}
void sharp1(Mat& image0,Mat&image)//先用at函数来进行,最直观也是最简单的。
{
image.create(image0.size(),image0.type());//两个大小相同。
for (int i = 1; i < image.rows-1; ++i)
{
for (int j = 1; j < image.cols-1; ++j)
{
image.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(5 * image0.at<Vec3b>(i, j)[0] - image0.at<Vec3b>(i-1, j)[0]- image0.at<Vec3b>(i, j-1)[0] - image0.at<Vec3b>(i+1, j)[0]- image0.at<Vec3b>(i, j+1)[0]);
image.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(5 * image0.at<Vec3b>(i, j)[1] - image0.at<Vec3b>(i-1, j)[1]- image0.at<Vec3b>(i, j-1)[1] - image0.at<Vec3b>(i+1, j)[1]- image0.at<Vec3b>(i, j+1)[1]);
image.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(5 * image0.at<Vec3b>(i, j)[2] - image0.at<Vec3b>(i-1, j)[2]- image0.at<Vec3b>(i, j-1)[2] - image0.at<Vec3b>(i+1, j)[2]- image0.at<Vec3b>(i, j+1)[2]);
}
}
image.row(0).setTo(Scalar::all(0));
image.row(image.rows-1).setTo(Scalar::all(0));
image.col(0).setTo(Scalar::all(0));
image.row(image.cols-1).setTo(Scalar::all(0));
}
void sharp2(Mat& image0,Mat&image)//用指针的方法来进行。
{
image.create(image0.size(),image0.type());
int x = image.channels();
for (int i = 1; i < image.rows - 1; ++i)
{
const uchar* pre = image0.ptr<uchar>(i-1);//上一行的头一个像素地址。
const uchar* current = image0.ptr<uchar>(i);
const uchar* nex = image0.ptr<uchar>(i+1);
uchar* p = image.ptr<uchar>(i);//结果图的最后一个指针。
for (int j = 1; j < x * (image.cols-1); ++j)
{
p[j] = saturate_cast<uchar>(5 * current[j] - current[j - x] - current[j + x] - pre[j] - nex[j]);
}
}
image.col(0).setTo(Scalar::all(0));
image.col(image.cols-1).setTo(Scalar::all(0));
image.row(0).setTo(Scalar::all(0));
image.row(image.rows-1).setTo(Scalar::all(0));
}
void sharp3(Mat& image0,Mat& image)//我们利用卷积核和filter2D的函数来进行。
{
Mat kernel(3, 3, CV_32F,Scalar::all(0));
kernel.at<float>(0,1)=-1;
kernel.at<float>(1,1)=5;
kernel.at<float>(1,0)=-1;
kernel.at<float>(1,2)=-1;
kernel.at<float>(2,1)=-1;
filter2D(image0,image,image.depth(),kernel);//系统自带。
}
三种方法进行图片锐化
最新推荐文章于 2024-07-17 12:32:57 发布