From b1b5ed44e0ea5bcf38be7aee3e1561f396e84e41 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Mon, 4 Dec 2023 17:54:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=A4=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E5=BA=95=E8=89=B2=E7=AE=97=E6=B3=95=EF=BC=8C=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E6=95=88=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImageApplyFadeBackGroundColor.cpp | 107 +++--------------- .../ImageApplyFadeBackGroundColor.h | 15 +-- hgdriver/hgdev/image_process.cpp | 2 +- 3 files changed, 24 insertions(+), 100 deletions(-) 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);