98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
#include "ImageApplyFilter.h"
|
|
|
|
CImageApplyFilter::CImageApplyFilter(FilterMode type, int kSize)
|
|
: m_type(type)
|
|
, m_kernel(kSize)
|
|
{
|
|
m_kSize = (m_type == FilterMode::Sharpen || m_type == FilterMode::AverBlur) ? 5 : 9;
|
|
}
|
|
|
|
CImageApplyFilter::~CImageApplyFilter()
|
|
{
|
|
}
|
|
|
|
void CImageApplyFilter::apply(cv::Mat& pDib, int side)
|
|
{
|
|
#ifdef LOG
|
|
FileTools::write_log("imgprc.txt", "enter CImageApplySharpen apply");
|
|
#endif // LOG
|
|
|
|
switch (m_type)
|
|
{
|
|
case FilterMode::Sharpen:
|
|
case FilterMode::Sharpen_More:
|
|
sharpen(pDib, m_kSize);
|
|
break;
|
|
case FilterMode::AverBlur:
|
|
case FilterMode::AverBlur_More:
|
|
averblur(pDib, static_cast<int>(m_kSize));
|
|
break;
|
|
case FilterMode::BilateralFilter:
|
|
bilateralFilter(pDib, m_kernel);
|
|
break;
|
|
case FilterMode::GaussianBlur:
|
|
gaussianBlur(pDib, m_kernel);
|
|
break;
|
|
case FilterMode::BrightSharp:
|
|
brightSharp(pDib);
|
|
break;
|
|
}
|
|
|
|
#ifdef LOG
|
|
FileTools::write_log("imgprc.txt", "exit CImageApplySharpen apply");
|
|
#endif // LOG
|
|
}
|
|
|
|
void CImageApplyFilter::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
|
{
|
|
if (mats.empty()) return;
|
|
|
|
if (!mats[0].empty())
|
|
apply(mats[0], 0);
|
|
|
|
if (isTwoSide && mats.size() > 1)
|
|
if (!mats[1].empty())
|
|
apply(mats[1], 1);
|
|
}
|
|
|
|
void CImageApplyFilter::averblur(cv::Mat& src, int kSize)
|
|
{
|
|
cv::blur(src, src, cv::Size(kSize, kSize));
|
|
}
|
|
|
|
void CImageApplyFilter::sharpen(cv::Mat& src, float kSize)
|
|
{
|
|
float other = (1.0f - kSize) / 4;
|
|
float kernel_data[] = { 0, other, 0, other, kSize, other, 0, other, 0 };
|
|
cv::Mat kernel(3, 3, CV_32FC1, kernel_data);
|
|
|
|
cv::filter2D(src, src, src.depth(), kernel);
|
|
}
|
|
|
|
void CImageApplyFilter::brightSharp(cv::Mat& src)
|
|
{
|
|
const float a = -0.49f;
|
|
const float b = 3.0f;
|
|
float kernel_data[] =
|
|
{
|
|
0, a, 0,
|
|
a, b, a,
|
|
0, a, 0
|
|
};
|
|
cv::Mat kernel(3, 3, CV_32FC1, kernel_data);
|
|
cv::filter2D(src, src, src.depth(), kernel);
|
|
}
|
|
|
|
void CImageApplyFilter::bilateralFilter(cv::Mat& src, double kernel)
|
|
{
|
|
cv::Mat dst;
|
|
cv::bilateralFilter(src, dst, static_cast<int>(kernel), kernel * 2, kernel / 2);
|
|
src.release();
|
|
src = dst;
|
|
}
|
|
|
|
void CImageApplyFilter::gaussianBlur(cv::Mat& src, int kSize)
|
|
{
|
|
cv::GaussianBlur(src, src, cv::Size(kSize, kSize), 0);
|
|
}
|