diff --git a/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.cpp b/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.cpp
index 91e9c36..0547854 100644
--- a/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.cpp
+++ b/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.cpp
@@ -1,17 +1,11 @@
#include "ImageApplyFadeBackGroundColor.h"
-
+#include "ImageProcess_Public.h"
CImageApplyFadeBackGroudColor::CImageApplyFadeBackGroudColor(int threshold, int offset, int range)
: m_threshold(threshold)
, m_offset(offset)
, m_range(range)
{
- memset(m_table1, 255, 768);
- memset(m_table1, 0, m_threshold * 3);
-
- memset(m_table2, 255, 256 * 3);
- for (size_t i = 0; i < 256; i++)
- m_table2[i] = i;
}
CImageApplyFadeBackGroudColor::~CImageApplyFadeBackGroudColor()
@@ -48,98 +42,33 @@ void CImageApplyFadeBackGroudColor::apply(cv::Mat& pDib, int side)
cv::add(pDib, cv::Scalar::all(255 + m_offset) - mean_bgr, pDib, mask);
#else
+#if 0
fadeBackground(pDib.data, pDib.cols, pDib.rows, pDib.step, m_threshold, m_offset, m_range);
+#else
+ fadeBackground(pDib, m_threshold, m_offset, m_range);
+#endif
#endif
}
-///
-/// 除文稿底色算法,仅支持24位图像
-///
-/// 图像数据头指针
-/// 每行数据大小
-/// 图像高度
-/// 阈值,参考值为100
-/// 文稿底色增亮偏移量,默认为0。值越大,背景越白,反之越暗
-void CImageApplyFadeBackGroudColor::fadeBackground(unsigned char* data, int width, int height, int bytesPerLine, int threshold, int offset, int range)
+void CImageApplyFadeBackGroudColor::fadeBackground(cv::Mat& image, int threshold, int offset, int range)
{
- memset(m_table1, 255, 768);
- memset(m_table1, 0, threshold * 3);
- memset(m_table2, 255, 256 * 3);
+ cv::Mat resizeMat;
+ cv::resize(image, resizeMat, cv::Size(200, 200));
+ cv::Mat mask;
+ cv::cvtColor(resizeMat, mask, cv::COLOR_BGR2GRAY);
+ cv::threshold(mask, mask, threshold, 255, cv::THRESH_BINARY);
- for (uint i = 0; i < 256; i++)
- m_table2[i] = i;
+ cv::Scalar bgc = hg::getBackGroundColor(resizeMat, mask, threshold);
- int hist_bgr[3][256] = { 0 };
-
- unsigned char* mask = new unsigned char[width * height];
- unsigned char* ptr_data = data;
- unsigned char* ptr_mask = mask;
- unsigned char b = 0;
-
- for (uint i = 0; i < height; i++, ptr_data += bytesPerLine, ptr_mask += width)
- for (uint j = 0, x = 0; j < width; j++, x += 3)
- {
- b = m_table1[ptr_data[x] + ptr_data[x + 1] + ptr_data[x + 2]];
- ptr_mask[j] = b;
- for (uint k = 0; k < 3; k++)
- hist_bgr[k][ptr_data[x + k] & b]++;
- }
-
- int max_vals[3] = { 0 };
- int max_indexes[3] = { 0 };
-
- for (uint i = 1; i < 256; i++)
- for (uint j = 0; j < 3; j++)
- if (hist_bgr[j][i] > max_vals[j])
- {
- max_vals[j] = hist_bgr[j][i];
- max_indexes[j] = i;
- }
-
- uchar table_rgb[3][256] = { 0 };
- for (uint i = 0; i < 3; i++)
+ std::vector low, up;
+ for (size_t i = 0; i < 3; i++)
{
- int start = cv::max(max_indexes[i] - range, 0);
- int end = cv::min(max_indexes[i] + range, 255);
- memset(table_rgb[i] + start, 255, cv::min(end - start + 1, 256 - start));
+ low.push_back(cv::max((int)bgc[i] - range, 0));
+ up.push_back(cv::min((int)bgc[i] + range, 255));
}
- ptr_data = data;
- ptr_mask = mask;
- for (uint i = 0; i < height; i++, ptr_data += bytesPerLine, ptr_mask += width)
- for (uint j = 0, x = 0; j < width; j++, x += 3)
- ptr_mask[j] &= table_rgb[0][ptr_data[x]] & table_rgb[1][ptr_data[x + 1]] & table_rgb[2][ptr_data[x + 2]];
-
- unsigned char offset_rgb[3];
- for (uint i = 0; i < 3; i++)
- offset_rgb[i] = cv::min(255 + offset - max_indexes[i], 255);
-
-#if 1
- ptr_data = data;
- ptr_mask = mask;
- for (uint i = 0; i < height; i++, ptr_data += bytesPerLine, ptr_mask += width)
- for (uint j = 0, x = 0; j < width; j++, x += 3)
- for (uint k = 0; k < 3; k++)
- ptr_data[x + k] = m_table2[(int)ptr_data[x + k] + (offset_rgb[k] & ptr_mask[j])];
-#else
- for (uint c = 0; c < 3; c++)
- {
- ptr_data = data + c;
- ptr_mask = mask;
- for (uint y = 0; y < height; y++)
- {
- int ptr_x = 0;
- for (uint x = 0; x < width; x++)
- {
- ptr_data[ptr_x] = m_table2[(int)ptr_data[ptr_x] + (offset_rgb[c] & ptr_mask[x])];
- ptr_x += 3;
- }
- ptr_data += bytesPerLine;
- ptr_mask += width;
- }
- }
-#endif
- delete[] mask;
+ cv::inRange(image, low, up, mask);
+ cv::add(image, cv::Scalar::all(offset), image, mask);
}
void CImageApplyFadeBackGroudColor::apply(std::vector& mats, bool isTwoSide)
diff --git a/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.h b/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.h
index ad749c5..f73331b 100644
--- a/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.h
+++ b/hgdriver/ImageProcess/ImageApplyFadeBackGroundColor.h
@@ -15,7 +15,8 @@
* 2022/03/08 v3.4 修复变量未初始化的BUG。
* 2022/10/22 v3.5 使opencv ROI的内存机制。
* 2023/11/22 v3.6 修复数值越界BUG。
- * 版本号:v3.6
+ * 2023/12/01 v3.7 优化算法,提高效能。
+ * 版本号:v3.7
* ====================================================
*/
@@ -26,7 +27,6 @@
#include "ImageApply.h"
-class CImageApplyAdjustColors;
class GIMGPROC_LIBRARY_API CImageApplyFadeBackGroudColor : public CImageApply
{
public:
@@ -43,25 +43,20 @@ public:
virtual void apply(std::vector& mats, bool isTwoSide);
private:
+
///
/// 除文稿底色算法,仅支持24位图像
///
- /// 图像数据头指针
- /// 图像宽度
- /// 图像高度
- /// 每行数据大小
+ /// 图像
/// 阈值。区分文稿和黑色背景。取值范围[0, 255],参考值为100
/// 文稿底色增亮偏移量,默认为0。值越大,背景越白,反之越暗
/// 背景色彩的浮动范围。要求大于等于1。值越大范围越大,更多的色彩被判定为底色并除色。参考值40
- void fadeBackground(unsigned char* data, int width, int height, int bytesPerLine, int threshold, int offset, int range);
+ void fadeBackground(cv::Mat& image, int threshold, int offset, int range);
private:
int m_threshold;
int m_offset;
int m_range;
- uchar m_table1[768];
- uchar m_table2[768];
- uchar m_table_rgb[3][256];
};
#endif // !IMAGE_APPLY_FADE_BACKGROUND_COLOR_H
diff --git a/hgdriver/hgdev/image_process.cpp b/hgdriver/hgdev/image_process.cpp
index 0aa3513..85d1999 100644
--- a/hgdriver/hgdev/image_process.cpp
+++ b/hgdriver/hgdev/image_process.cpp
@@ -739,7 +739,7 @@ namespace hg_imgproc
mats_.clear();
- CImageApplyFadeBackGroudColor fade(20, 100, img_conf_.fadebackrange);
+ CImageApplyFadeBackGroudColor fade(20, 255, img_conf_.fadebackrange);
for(size_t i = 0; i < mats.size();i++)
{
fade.apply(mats[i],img_conf_.is_duplex);