#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(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& 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(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); }