From 60a74afd5c63ac0b60cb549e21e6a8ad2a04999c Mon Sep 17 00:00:00 2001
From: yangjiaxuan <171295266@qq.com>
Date: Mon, 31 Jul 2023 18:55:31 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=A4=E8=89=B2=E7=AE=97?=
=?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
hgdriver/ImageProcess/ImageApplyChannel.cpp | 50 +++++++++++++--
hgdriver/ImageProcess/ImageApplyChannel.h | 68 +++++++++++++--------
2 files changed, 86 insertions(+), 32 deletions(-)
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