2022-05-03 03:56:07 +00:00
|
|
|
#include "ImageApplyChannel.h"
|
|
|
|
#include "ImageApplyAdjustColors.h"
|
|
|
|
|
|
|
|
CImageApplyChannel::CImageApplyChannel()
|
|
|
|
: m_channel(Invalid)
|
|
|
|
, colors(new CImageApplyAdjustColors(0, 30, 1.0))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
CImageApplyChannel::CImageApplyChannel(Channel channel)
|
|
|
|
: m_channel(channel)
|
|
|
|
, colors(new CImageApplyAdjustColors(0, 30, 1.0))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
CImageApplyChannel::~CImageApplyChannel()
|
|
|
|
{
|
|
|
|
if (colors != nullptr) delete colors;
|
|
|
|
}
|
|
|
|
|
2022-05-04 03:03:01 +00:00
|
|
|
void CImageApplyChannel::apply(cv::Mat& pDib, int side)
|
2022-05-03 03:56:07 +00:00
|
|
|
{
|
2022-05-04 03:03:01 +00:00
|
|
|
(void)side;
|
|
|
|
if (pDib.empty()) return;
|
2022-05-03 03:56:07 +00:00
|
|
|
|
|
|
|
cv::Mat dst(pDib.rows, pDib.cols, CV_8UC1);
|
|
|
|
switch (m_channel)
|
|
|
|
{
|
|
|
|
case Red:
|
|
|
|
cv::extractChannel(pDib, dst, 2);
|
|
|
|
colors->apply(pDib, side);
|
|
|
|
break;
|
|
|
|
case Green:
|
|
|
|
cv::extractChannel(pDib, dst, 1);
|
|
|
|
break;
|
|
|
|
case Blue:
|
|
|
|
cv::extractChannel(pDib, dst, 0);
|
2022-05-04 03:03:01 +00:00
|
|
|
break;
|
|
|
|
case All:
|
|
|
|
colourless(pDib, dst, 80);
|
2022-05-03 03:56:07 +00:00
|
|
|
break;
|
|
|
|
case Except_Red:
|
|
|
|
except_channel(pDib, dst, 2);
|
|
|
|
break;
|
|
|
|
case Except_Green:
|
|
|
|
except_channel(pDib, dst, 1);
|
|
|
|
break;
|
|
|
|
case Except_Blue:
|
|
|
|
except_channel(pDib, dst, 0);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
pDib.release();
|
|
|
|
pDib = dst;
|
|
|
|
|
|
|
|
#ifdef LOG
|
|
|
|
FileTools::write_log("imgprc.txt", "exit CImageApplyChannel apply");
|
|
|
|
#endif // LOG
|
|
|
|
}
|
|
|
|
|
|
|
|
void CImageApplyChannel::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
|
|
|
{
|
2022-05-04 03:03:01 +00:00
|
|
|
(void)isTwoSide;
|
2022-05-03 03:56:07 +00:00
|
|
|
int i = 0;
|
|
|
|
for (cv::Mat& var : mats) {
|
|
|
|
if (i != 0 && isTwoSide == false)
|
|
|
|
break;
|
|
|
|
if (!var.empty())
|
|
|
|
apply(var, 0);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-04 03:03:01 +00:00
|
|
|
void CImageApplyChannel::except_channel(const cv::Mat& src, cv::Mat& dst, int channel)
|
2022-05-03 03:56:07 +00:00
|
|
|
{
|
2022-05-04 03:03:01 +00:00
|
|
|
cv::Mat mv[3];
|
|
|
|
cv::split(src, mv);
|
|
|
|
cv::Mat mask, mask1, mask2;
|
2022-05-03 03:56:07 +00:00
|
|
|
switch (channel)
|
|
|
|
{
|
|
|
|
case 0:
|
2022-05-04 03:03:01 +00:00
|
|
|
mask1 = mv[0] - mv[1];
|
|
|
|
mask2 = mv[0] - mv[2];
|
2022-05-03 03:56:07 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2022-05-04 03:03:01 +00:00
|
|
|
mask1 = mv[1] - mv[0];
|
|
|
|
mask2 = mv[1] - mv[2];
|
2022-05-03 03:56:07 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2022-05-04 03:03:01 +00:00
|
|
|
mask1 = mv[2] - mv[1];
|
|
|
|
mask2 = mv[2] - mv[0];
|
2022-05-03 03:56:07 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2022-05-04 03:03:01 +00:00
|
|
|
cv::min(mask1, mask2, mask);
|
|
|
|
|
|
|
|
cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
|
|
|
|
dst -= mask;
|
2022-05-03 03:56:07 +00:00
|
|
|
}
|
|
|
|
|
2022-05-04 03:03:01 +00:00
|
|
|
void CImageApplyChannel::colourless(const cv::Mat& src, cv::Mat& dst, uchar threshold)
|
2022-05-03 03:56:07 +00:00
|
|
|
{
|
2022-05-04 03:03:01 +00:00
|
|
|
if (src.channels() != 3)
|
|
|
|
{
|
|
|
|
dst = src;
|
|
|
|
return;
|
|
|
|
}
|
2022-05-03 03:56:07 +00:00
|
|
|
|
2022-05-04 03:03:01 +00:00
|
|
|
cv::Mat hsv;
|
|
|
|
cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV_FULL);
|
|
|
|
cv::Mat mv_hsv[3];
|
|
|
|
cv::split(hsv, mv_hsv);
|
|
|
|
size_t total = mv_hsv[1].total();
|
|
|
|
uchar* ptr_s = mv_hsv[1].data;
|
|
|
|
uchar* ptr_v = mv_hsv[2].data;
|
|
|
|
for (size_t i = 0; i < total; i++)
|
|
|
|
if (ptr_s[i] > threshold)
|
|
|
|
{
|
|
|
|
ptr_s[i] = 0;
|
|
|
|
ptr_v[i] = 255;
|
|
|
|
}
|
|
|
|
cv::merge(mv_hsv, 3, hsv);
|
|
|
|
cv::cvtColor(hsv, hsv, cv::COLOR_HSV2BGR_FULL);
|
|
|
|
cv::cvtColor(hsv, dst, cv::COLOR_BGR2GRAY);
|
2022-05-03 03:56:07 +00:00
|
|
|
}
|