原理:
/**
* 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();
}