高提升滤波

原理:

 

/**
*  Author:LiBin
*  Description:基于Lalacian的锐化算子
*  @param  src:源图像(单通道/3通道)
*  @param  dst:目标图像
*  @return:无
**/
void EnhanceFilter(cv::Mat &src, cv::Mat &dst, float coef,float A=1.3)
{
	bool color = true;
	if (!src.data)
	{
		printf("image data is empty!\n");
		return;
	}
	cv::Mat cv8uc3mat;
	if (src.channels() ==1)
		color=false;
	cv::Mat kernel = (Mat_<float>(3, 3) << 0, 1, 0, 1, -4, 1, 0, 1, 0);
	cv::Mat result;
	result.create(src.size(), CV_8UC3);
	float sumfilterch_n1, sumfilterch_n2, sumfilterch_n3;
	for (int i = 1; i < src.rows - 1; i++)
	{
		//uchar *ptr1 = src.ptr<uchar>(i);
		for (int j = 1; j < src.cols - 1; j++)
		{
			sumfilterch_n1= sumfilterch_n2= sumfilterch_n3 = 0.f;
			if (color)
			{
				for (int m = 0; m < kernel.rows; ++m)
				{
					for (int n = 0; n < kernel.cols; ++n)
					{
						sumfilterch_n1 += static_cast<float>(kernel.at<float>(m, n)* src.at<Vec3b>(i + m - 1, j + n - 1)[0]);
						sumfilterch_n2 += static_cast<float>(kernel.at<float>(m, n)* src.at<Vec3b>(i + m - 1, j + n - 1)[1]);
						sumfilterch_n3 += static_cast<float>(kernel.at<float>(m, n)* src.at<Vec3b>(i + m - 1, j + n - 1)[2]);
					}
				}
				int src_ch1 = A*src.at<Vec3b>(i, j)[0] - sumfilterch_n1;
				int src_ch2 = A*src.at<Vec3b>(i, j)[1] - sumfilterch_n2;
				int src_ch3 = A*src.at<Vec3b>(i, j)[2] - sumfilterch_n3;
				
				if (src_ch1>255) src_ch1 = 255;
				else if (src_ch1 < 1e-6) src_ch1 = 0;

				if (src_ch2>255) src_ch2 = 255;
				else if (src_ch2 < 1e-6) src_ch2 = 0;

				if (src_ch3>255) src_ch3 = 255;
				else if (src_ch3 < 1e-6) src_ch3 = 0;
				
				result.at<Vec3b>(i, j)[0] = static_cast<uchar>(src_ch1);
				result.at<Vec3b>(i, j)[1] = static_cast<uchar>(src_ch2);
				result.at<Vec3b>(i, j)[2] = static_cast<uchar>(src_ch3);
			}
			else
			{
				src.convertTo(cv8uc3mat, CV_8UC1);
				for (int m = 0; m < kernel.rows; ++m)
				{
					for (int n = 0; n < kernel.cols; ++n)
					{
						sumfilterch_n1 += static_cast<float>(kernel.at<char>(m, n)* src.at<uchar>(i + m - 1, j + n - 1));
					}
				}

				sumfilterch_n1 *= coef;
				int src_ch = A*src.at<uchar>(i, j) - sumfilterch_n1;
				if (src_ch>255) src_ch = 255;
				else if (src_ch < 1e-6) src_ch = 0;
				result.at<uchar>(i, j) = static_cast<uchar>(src_ch);
			}
		}
	}
	dst = result.clone();
	result.release();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值