三种方法进行图片锐化

#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);//系统自带。
}



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值