code_device/hgdriver/ImageProcess/ImageApplyHSVCorrect.h

96 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ====================================================
*
* 功能彩色图像色彩校正。基于LUT实现预设BGR查值表表达所有HVS对BGR原图进行查值校正。
* 作者:刘丁维
* 生成时间2020/3/21
* 最近修改时间v1.0 2020/03/21
v1.1 2020/06/15 调整除红效果的HSV取值范围
v1.2 2021/08/02 调整内存指针适应ROI图像的内存偏移。
v1.3 2021/08/26 替换答题卡除红Red_Removal实现方案。
v1.4 2022/04/22 增加功能支持用像素灰度值填充原来彩色像素删除默认构造函数增加校正选项Deafault和LowSaturation_Removal
v1.4.1 2022/04/25 调整数据类型,避免数据访问越界。
v1.4.2 2022/06/09 修复一个内存大小的错误。
* 版本号v1.4.2
*
* ====================================================
*/
#ifndef IMAGE_APPLY_COLOR_CORRECT_H
#define IMAGE_APPLY_COLOR_CORRECT_H
#include "ImageApply.h"
class GIMGPROC_LIBRARY_API CImageApplyHSVCorrect : public CImageApply
{
public:
enum CorrectOption
{
Deafault, //默认,无任何除色效果
LowSaturation_Removal, //除掉低饱和度像素
Red_Removal //除掉红色。红色定义H:[0, 85][170, 255],S:[10, 255],V:[120,255]
};
public:
/*
* mode [in]:预设初色模式
* cvtColor [in]:替代像素使用默认值还是使用灰度值。true为灰度值false为默认值
* bgr:[in] 用uint表示BGR值B在低位R在高位。当cvtGray 为false时生效)
*/
CImageApplyHSVCorrect(CorrectOption mode = CorrectOption::Deafault, bool cvtColor = false, uint bgr = 0x00FFFFFF);
virtual ~CImageApplyHSVCorrect();
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
/*
* 函数功能初始化查值表按照RGBR在高位B在低位的32位数据进行索引值与索引一致。
表中索引范围[00x00FFFFFF]。在构造函数中会默认调用该函数。
*/
void initLUT();
/*
* 函数功能将查值表指定RGB索引值设置为目标值。
索引 = src_b | (src_g << 8) | (src_r << 16)
值 = dst_b | (dst_g << 8) | (dst_r << 16)
* src_b:[in] 原查值表B通道索引
* src_g:[in] 原查值表G通道索引
* src_r:[in] 原查值表R通道索引
* dst_b:[in] 目标查值表B通道值
* dst_g:[in] 目标查值表G通道值
* dst_r:[in] 目标查值表R通道值
*/
void set_single(const uint src_b, const uint src_g, const uint src_r,
const uint dst_b, const uint dst_g, const uint dst_r);
/*
* 函数功能按照HSV色彩空间描述色彩范围将该范围对应的BGR索引设置为0x00FFFFFF(默认白色)
* range_h:[in] H分量范围取值范围[0, 255]
* range_s:[in] S分量范围取值范围[0, 255]
* range_v:[in] V分量范围取值范围[0, 255]
* bgr:[in] 用uint表示BGR值B在低位R在高位。当cvtGray 为false时生效)
* cvtGray:[in] 为true时根据RGB值转换为灰度值
*/
void set_HSV_value(const std::pair<uchar, uchar>& range_h,
const std::pair<uchar, uchar>& range_s,
const std::pair<uchar, uchar>& range_v,
uint bgr = 0x00FFFFFF, bool cvtGray = false);
/*
* 函数功能:设置外部查值表,表默认长度为 256 * 256 * 256 * sizeof(uint
* table:[in] 数组指针
*/
void set_table(const uint* table);
private:
static bool contained(uchar value, const std::pair<uchar, uchar>& range);
static void RGB_2_HSV_full(int r, int g, int b, uchar& h, uchar& s, uchar& v);
private:
uint* m_table;
};
#endif