qt-correction-tool/imageprocess/ImageApplyFilter.cpp

82 lines
1.6 KiB
C++

#include "ImageApplyFilter.h"
CImageApplyFilter::CImageApplyFilter(FilterMode type, int kSize)
: m_type(type)
, m_kernel(kSize)
{
m_kSize = (m_type == 1 || m_type == 3) ? 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 1:
case 2:
sharpen(pDib, m_kSize);
break;
case 3:
case 4:
averblur(pDib, static_cast<int>(m_kSize));
break;
case 5:
bilateralFilter(pDib, m_kernel);
break;
case 6:
gaussianBlur(pDib, m_kernel);
}
#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::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);
}