更新除色算法
This commit is contained in:
parent
35993f35a7
commit
60a74afd5c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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_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"
|
#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.333333;Green_Plus时, m_scale = 1;Blue_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
|
||||||
|
|
Loading…
Reference in New Issue