更新除色算法

This commit is contained in:
yangjiaxuan 2023-07-31 18:55:31 +08:00
parent 35993f35a7
commit 60a74afd5c
2 changed files with 86 additions and 32 deletions

View File

@ -1,21 +1,38 @@
#include "ImageApplyChannel.h" #include "ImageApplyChannel.h"
#include "ImageApplyAdjustColors.h"
CImageApplyChannel::CImageApplyChannel() CImageApplyChannel::CImageApplyChannel()
: m_channel(Invalid) : m_channel(Invalid)
, colors(new CImageApplyAdjustColors(0, 30, 1.0)) , m_scale(0)
{ {
} }
CImageApplyChannel::CImageApplyChannel(Channel channel) CImageApplyChannel::CImageApplyChannel(Channel channel)
: m_channel(channel) : m_channel(channel)
, colors(new CImageApplyAdjustColors(0, 30, 1.0)) {
switch (m_channel)
{
case Red_Plus:
m_scale = 0.333333;
break;
case Green_Plus:
m_scale = 1;
break;
case Blue_Plus:
m_scale = 1;
break;
default:
m_scale = 0;
}
}
CImageApplyChannel::CImageApplyChannel(Channel channel, double scale)
: m_channel(channel)
, m_scale(scale)
{ {
} }
CImageApplyChannel::~CImageApplyChannel() CImageApplyChannel::~CImageApplyChannel()
{ {
if (colors != nullptr) delete colors;
} }
void CImageApplyChannel::apply(cv::Mat& pDib, int side) void CImageApplyChannel::apply(cv::Mat& pDib, int side)
@ -24,11 +41,13 @@ void CImageApplyChannel::apply(cv::Mat& pDib, int side)
if (pDib.empty()) return; if (pDib.empty()) return;
cv::Mat dst(pDib.rows, pDib.cols, CV_8UC1); cv::Mat dst(pDib.rows, pDib.cols, CV_8UC1);
cv::Mat mv[3];
cv::split(pDib, mv);
cv::Mat mask, mask1, mask2;
switch (m_channel) switch (m_channel)
{ {
case Red: case Red:
cv::extractChannel(pDib, dst, 2); cv::extractChannel(pDib, dst, 2);
colors->apply(pDib, side);
break; break;
case Green: case Green:
cv::extractChannel(pDib, dst, 1); cv::extractChannel(pDib, dst, 1);
@ -48,6 +67,15 @@ void CImageApplyChannel::apply(cv::Mat& pDib, int side)
case Except_Blue: case Except_Blue:
except_channel(pDib, dst, 0); except_channel(pDib, dst, 0);
break; break;
case Red_Plus:
channel_plus(pDib, dst, 2, m_scale);
break;
case Green_Plus:
channel_plus(pDib, dst, 1, m_scale);
break;
case Blue_Plus:
channel_plus(pDib, dst, 0, m_scale);
break;
default: default:
break; break;
} }
@ -125,3 +153,15 @@ void CImageApplyChannel::colourless(const cv::Mat& src, cv::Mat& dst, uchar thre
cv::cvtColor(hsv, hsv, cv::COLOR_HSV2BGR_FULL); cv::cvtColor(hsv, hsv, cv::COLOR_HSV2BGR_FULL);
cv::cvtColor(hsv, dst, cv::COLOR_BGR2GRAY); cv::cvtColor(hsv, dst, cv::COLOR_BGR2GRAY);
} }
void CImageApplyChannel::channel_plus(const cv::Mat& src, cv::Mat& dst, int channel, double scale)
{
cv::Mat mv[3];
cv::split(src, mv);
cv::Mat temp;
temp = mv[channel] * 2 - mv[(channel + 1) % 3] - mv[(channel + 2) % 3];
//cv::imwrite("111/temp.jpg", temp);
dst = mv[channel] + temp * scale;
}

View File

@ -3,12 +3,15 @@
* BGR图像中的单个通道 * BGR图像中的单个通道
* *
* 2020/4/21 * 2020/04/21
* v1.0 2020/4/21 * v1.0 2020/04/21
v1.1 2020/6/11 v1.1 2020/06/11
v1.2 2020/7/21 绿 v1.2 2020/07/21 绿
v1.3 2021/5/24 v1.3 2021/05/24
* v1.3 v1.4 2023/03/01 Red_PlusGreen_Plus和Blue_Plus模式使CImageApplyAdjustColors增强通道
v1.5 2023/03/16 Red_PlusGreen_Plus和Blue_Plus除色增强比例
v1.5.1 2023/03/16 BUG
* v1.5.1
* ==================================================== * ====================================================
*/ */
@ -18,48 +21,59 @@
#include "ImageApply.h" #include "ImageApply.h"
class CImageApplyAdjustColors;
class GIMGPROC_LIBRARY_API CImageApplyChannel : public CImageApply class GIMGPROC_LIBRARY_API CImageApplyChannel : public CImageApply
{ {
public: public:
typedef enum channel typedef enum channel
{ {
Red, //红色通道 Red_Plus, //增强红色通道
Green, //绿色通道 Green_Plus, //增强绿色通道
Blue, //蓝色通道 Blue_Plus, //增强蓝色通道
All, //去除所有HSV色彩结构中S大于80的色彩 All, //去除所有HSV色彩结构中S大于80的色彩
Invalid, //无效 Invalid, //无效
Except_Red, //绿蓝色通道混合 Except_Red, //绿蓝色通道混合
Except_Green, //红蓝色通道混合 Except_Green, //红蓝色通道混合
Except_Blue //红绿色通道混合 Except_Blue, //红绿色通道混合
}Channel; Red, //红色通道
Green, //绿色通道
Blue, //蓝色通道
}Channel;
public: public:
CImageApplyChannel();
/* CImageApplyChannel();
* channel [in]:
* */
CImageApplyChannel(Channel channel);
virtual ~CImageApplyChannel(void); /// <summary>
/// 构造函数
/// 默认Red_Plus时m_scale = 0.333333Green_Plus时 m_scale = 1Blue_Plus时 m_scale = 1
/// </summary>
/// <param name="channel">通道模式</param>
CImageApplyChannel(Channel channel);
virtual void apply(cv::Mat& pDib,int side); /// <summary>
/// 构造函数
/// </summary>
/// <param name="channel">通道模式</param>
/// <param name="scale">仅在Red_Plus、 Green_Plus、 Blue_Plus模式下生效。增强除色效果取值范围[0, +∞),值越大增强效果越明显</param>
CImageApplyChannel(Channel channel, double scale);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide); virtual ~CImageApplyChannel(void);
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
private: private:
void except_channel(const cv::Mat& src, cv::Mat& dst, int channel); void except_channel(const cv::Mat& src, cv::Mat& dst, int channel);
void colourless(const cv::Mat& src, cv::Mat& dst, uchar threshold = 80); void colourless(const cv::Mat& src, cv::Mat& dst, uchar threshold = 80);
private: void channel_plus(const cv::Mat& src, cv::Mat& dst, int channel, double scale);
Channel m_channel; private:
CImageApplyAdjustColors* colors; Channel m_channel;
double m_scale;
}; };
#endif // !IMAGE_APPLY_CHANNEL_H #endif // !IMAGE_APPLY_CHANNEL_H