diff --git a/hgdriver/ImageProcess/ImageApplyChannel.cpp b/hgdriver/ImageProcess/ImageApplyChannel.cpp index e18ba75..301bbbf 100644 --- a/hgdriver/ImageProcess/ImageApplyChannel.cpp +++ b/hgdriver/ImageProcess/ImageApplyChannel.cpp @@ -1,21 +1,38 @@ #include "ImageApplyChannel.h" -#include "ImageApplyAdjustColors.h" CImageApplyChannel::CImageApplyChannel() : m_channel(Invalid) - , colors(new CImageApplyAdjustColors(0, 30, 1.0)) + , m_scale(0) { } CImageApplyChannel::CImageApplyChannel(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() { - if (colors != nullptr) delete colors; } void CImageApplyChannel::apply(cv::Mat& pDib, int side) @@ -24,11 +41,13 @@ void CImageApplyChannel::apply(cv::Mat& pDib, int side) if (pDib.empty()) return; 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) { case Red: cv::extractChannel(pDib, dst, 2); - colors->apply(pDib, side); break; case Green: cv::extractChannel(pDib, dst, 1); @@ -48,6 +67,15 @@ void CImageApplyChannel::apply(cv::Mat& pDib, int side) case Except_Blue: except_channel(pDib, dst, 0); 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: 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, 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; +} diff --git a/hgdriver/ImageProcess/ImageApplyChannel.h b/hgdriver/ImageProcess/ImageApplyChannel.h index 0bc9220..6954983 100644 --- a/hgdriver/ImageProcess/ImageApplyChannel.h +++ b/hgdriver/ImageProcess/ImageApplyChannel.h @@ -3,12 +3,15 @@ * 功能:通道提取,又名除色。可提取BGR图像中的单个通道、两种通道的混合以及去除彩色像素的图像,目标图像均为灰度图 * 作者:刘丁维 - * 生成时间:2020/4/21 - * 最近修改时间:v1.0 2020/4/21 - v1.1 2020/6/11 在除红时,增加对比度,提高除色效果。 - v1.2 2020/7/21 修正之前增强红绿蓝效果的色彩配比。 - v1.3 2021/5/24 替换红色增强算法方案。 - * 版本号:v1.3 + * 生成时间:2020/04/21 + * 最近修改时间:v1.0 2020/04/21 + v1.1 2020/06/11 在除红时,增加对比度,提高除色效果。 + v1.2 2020/07/21 修正之前增强红绿蓝效果的色彩配比。 + v1.3 2021/05/24 替换红色增强算法方案。 + v1.4 2023/03/01 增加Red_Plus、Green_Plus和Blue_Plus模式。取消使用CImageApplyAdjustColors增强通道。 + v1.5 2023/03/16 可自定义Red_Plus、Green_Plus和Blue_Plus除色增强比例。 + v1.5.1 2023/03/16 修复通道切换的BUG。 + * 版本号:v1.5.1 * ==================================================== */ @@ -18,48 +21,59 @@ #include "ImageApply.h" -class CImageApplyAdjustColors; class GIMGPROC_LIBRARY_API CImageApplyChannel : public CImageApply { public: - typedef enum channel - { - Red, //红色通道 - Green, //绿色通道 - Blue, //蓝色通道 + typedef enum channel + { + Red_Plus, //增强红色通道 + Green_Plus, //增强绿色通道 + Blue_Plus, //增强蓝色通道 All, //去除所有HSV色彩结构中,S大于80的色彩 Invalid, //无效 Except_Red, //绿蓝色通道混合 Except_Green, //红蓝色通道混合 - Except_Blue //红绿色通道混合 - }Channel; + Except_Blue, //红绿色通道混合 + Red, //红色通道 + Green, //绿色通道 + Blue, //蓝色通道 + }Channel; public: - - CImageApplyChannel(); - /* - * channel [in]:通道模式 - * */ - CImageApplyChannel(Channel channel); + CImageApplyChannel(); - virtual ~CImageApplyChannel(void); + /// + /// 构造函数 + /// 默认Red_Plus时,m_scale = 0.333333;Green_Plus时, m_scale = 1;Blue_Plus时 m_scale = 1 + /// + /// 通道模式 + CImageApplyChannel(Channel channel); - virtual void apply(cv::Mat& pDib,int side); + /// + /// 构造函数 + /// + /// 通道模式 + /// 仅在Red_Plus、 Green_Plus、 Blue_Plus模式下生效。增强除色效果,取值范围[0, +∞),值越大增强效果越明显 + CImageApplyChannel(Channel channel, double scale); - virtual void apply(std::vector& mats, bool isTwoSide); + virtual ~CImageApplyChannel(void); + virtual void apply(cv::Mat& pDib, int side); + + virtual void apply(std::vector& mats, bool isTwoSide); 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); -private: + void channel_plus(const cv::Mat& src, cv::Mat& dst, int channel, double scale); - Channel m_channel; - CImageApplyAdjustColors* colors; +private: + Channel m_channel; + double m_scale; }; #endif // !IMAGE_APPLY_CHANNEL_H