imgproc增加HSV校正算法

This commit is contained in:
luoliangyi 2022-06-20 14:18:21 +08:00
parent 71ae9ebcaf
commit b11a238ec4
4 changed files with 144 additions and 6 deletions

View File

@ -15,6 +15,7 @@ HGImgProc_ImageDispersion
HGImgProc_ImageFadeBkColor
HGImgProc_ImageFilter
HGImgProc_ImageOutHole
HGImgProc_ImageHSVCorrect
HGImgProc_CreateOCRMgr
HGImgProc_DestroyOCRMgr

View File

@ -105,10 +105,10 @@ BOOL CHGTestDlg::OnInitDialog()
SetIcon(m_hIcon, FALSE); // 设置小图标
HGImage img = NULL;
HGImgFmt_LoadImage("D:\\1.jpg", 0, NULL, HGBASE_IMGTYPE_BGRA, HGBASE_IMGORIGIN_TOP, &img);
HGImgFmt_LoadImage("D:\\1.jpg", 0, NULL, HGBASE_IMGTYPE_BINARY, HGBASE_IMGORIGIN_TOP, &img);
if (NULL != img)
{
HGImgProc_ImageFilter(img, img, HGIMGPROC_FILTERTYPE_GAUSSIANBLUR, 31);
HGImgProc_ImageHSVCorrect(img, img, HGIMGPROC_CORRECTOPTION_LOWSATURATION_REMOVAL, HGTRUE, HG_MAKECOLOR(255, 0, 0, 0));
HGImgFmt_SaveImage(img, 0, NULL, "D:\\222.bmp");
HGBase_DestroyImage(img);

View File

@ -9,6 +9,7 @@
#include "./ImageProcess/ImageApplyFadeBackGroundColor.h"
#include "./ImageProcess/ImageApplyFilter.h"
#include "./ImageProcess/ImageApplyOutHole.h"
#include "./ImageProcess/ImageApplyHSVCorrect.h"
#include "CvxText.hpp"
#include "../base/HGInc.h"
#include "../base/HGUtility.h"
@ -1237,3 +1238,118 @@ HGResult HGAPI HGImgProc_ImageOutHole(HGImage image1, HGImage image2, HGFloat bo
return HGBASE_ERR_OK;
}
HGResult HGAPI HGImgProc_ImageHSVCorrect(HGImage image, HGImage destImage, HGUInt correctOption, HGBool cvtGray, HGColor color)
{
if (NULL == image || correctOption < HGIMGPROC_CORRECTOPTION_DEFAULT || correctOption > HGIMGPROC_CORRECTOPTION_RED_REMOVAL)
{
return HGBASE_ERR_INVALIDARG;
}
CImageApplyHSVCorrect::CorrectOption correctOption2 = CImageApplyHSVCorrect::Deafault;
if (HGIMGPROC_CORRECTOPTION_LOWSATURATION_REMOVAL == correctOption)
correctOption2 = CImageApplyHSVCorrect::LowSaturation_Removal;
else if (HGIMGPROC_CORRECTOPTION_RED_REMOVAL == correctOption)
correctOption2 = CImageApplyHSVCorrect::Red_Removal;
bool cvtGray2 = cvtGray ? true : false;
HGUInt r = HG_GETCOLOR_R(color);
HGUInt g = HG_GETCOLOR_G(color);
HGUInt b = HG_GETCOLOR_B(color);
uint color2 = (uint)(((HGUInt)r << 16) | ((HGUInt)g << 8) | (HGUInt)b);
HGImageInfo imgInfo;
HGBase_GetImageInfo(image, &imgInfo);
HGUInt type = imgInfo.type;
HGByte* data = NULL;
HGBase_GetImageData(image, &data);
HGImageRoi roi;
HGBase_GetImageROI(image, &roi);
HGUInt roiWidth = roi.right - roi.left;
HGUInt roiHeight = roi.bottom - roi.top;
if (NULL == destImage || image == destImage)
{
if (HGBASE_IMGTYPE_BGR != type)
{
HGImage imageTmp = NULL;
HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_BGR, 0, &imageTmp);
if (HGBASE_ERR_OK == ret)
{
ret = HGImgProc_ImageHSVCorrect(imageTmp, imageTmp, correctOption, cvtGray, color);
if (HGBASE_ERR_OK == ret)
{
ret = HGBase_CopyImage(imageTmp, image);
}
HGBase_DestroyImage(imageTmp);
}
return ret;
}
uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * 3;
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * 3;
cv::Mat img(roiHeight, roiWidth, CV_8UC(3), p, imgInfo.widthStep);
CImageApplyHSVCorrect imgApply(correctOption2, cvtGray2, color2);
imgApply.apply(img, 0);
assert(img.data == p);
}
else
{
HGImageInfo destImgInfo;
HGBase_GetImageInfo(destImage, &destImgInfo);
HGUInt destType = destImgInfo.type;
if (type != destType)
{
return HGBASE_ERR_INVALIDDATA;
}
HGByte* destData = NULL;
HGBase_GetImageData(destImage, &destData);
HGImageRoi destRoi;
HGBase_GetImageROI(destImage, &destRoi);
HGUInt destRoiWidth = destRoi.right - destRoi.left;
HGUInt destRoiHeight = destRoi.bottom - destRoi.top;
if (roiWidth != destRoiWidth || roiHeight != destRoiHeight)
{
return HGBASE_ERR_INVALIDDATA;
}
if (HGBASE_IMGTYPE_BGR != type)
{
HGImage imageTmp = NULL;
HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_BGR, 0, &imageTmp);
if (HGBASE_ERR_OK == ret)
{
ret = HGImgProc_ImageHSVCorrect(imageTmp, imageTmp, correctOption, cvtGray, color);
if (HGBASE_ERR_OK == ret)
{
ret = HGBase_CopyImage(imageTmp, destImage);
}
HGBase_DestroyImage(imageTmp);
}
return ret;
}
HGBase_CopyImage(image, destImage);
uint8_t* pDest = destData + destRoi.top * destImgInfo.widthStep + destRoi.left * 3;
if (HGBASE_IMGORIGIN_BOTTOM == destImgInfo.origin)
pDest = destData + (destImgInfo.height - destRoi.bottom) * destImgInfo.widthStep + destRoi.left * 3;
cv::Mat destImg(destRoiHeight, destRoiWidth, CV_8UC(3), pDest, destImgInfo.widthStep);
CImageApplyHSVCorrect imgApply(correctOption2, cvtGray2, color2);
imgApply.apply(destImg, 0);
assert(destImg.data == pDest);
}
return HGBASE_ERR_OK;
}

View File

@ -87,16 +87,23 @@
/* 5 * 5提亮锐化 */
#define HGIMGPROC_FILTERTYPE_BRIGHTSHARP 7L
/* 默认,无任何除色效果 */
#define HGIMGPROC_CORRECTOPTION_DEFAULT 1L
/* 除掉低饱和度像素 */
#define HGIMGPROC_CORRECTOPTION_LOWSATURATION_REMOVAL 2L
/* 除掉红色。红色定义H:[0, 85][170, 255],S:[10, 255],V:[120,255] */
#define HGIMGPROC_CORRECTOPTION_RED_REMOVAL 3L
/* 自动裁剪参数 */
typedef struct
{
HGBool convex; /* 黑底填充时的填充方式, true为凸多边形填充false为凹多边形填充默认true */
HGBool fillColor; /* 黑底填充时采用自适应色彩填充false为白色填充true为自适应文稿底色填充默认false */
HGBool convex; /* 黑底填充时的填充方式, HGTRUE为凸多边形填充HGFALSE为凹多边形填充默认HGTRUE */
HGBool fillColor; /* 黑底填充时采用自适应色彩填充,HGFALSE为白色填充HGTRUE为自适应文稿底色填充默认HGFALSE */
HGDouble threshold; /* 二值化阈值,取值范围(0, 255)默认40 */
HGInt noise; /* 除噪像素能够消除noise宽度的背景竖条纹干扰默认8 */
HGInt indent; /* 轮廓缩进裁剪、纠偏或者黑底填充时对探索到的纸张轮廓进行缩进indent像素默认5 */
HGBool normalCrop; /* crop deskew fillBlank失效固定裁切采用最传统的裁切方式默认false */
HGBool dispersion; /* 是否除色散,默认true */
HGBool normalCrop; /* crop deskew fillBlank失效固定裁切采用最传统的裁切方式默认HGFALSE */
HGBool dispersion; /* 是否除色散,默认HGTRUE */
}HGImgAutoCropParam;
/* 白底检查参数 */
@ -299,4 +306,18 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageFilter(HGImage image, HGImage destImage,
*/
HGEXPORT HGResult HGAPI HGImgProc_ImageOutHole(HGImage image1, HGImage image2, HGFloat borderSize, HGFloat edgeScale, HGDouble threshold);
/* 色彩校正
* 1) image: in,
* 2) destImage: in,
* 3) correctOption: in, , HGIMGPROC_CORRECTOPTION_*
* 4) cvtGray: in, 使使HGTRUE为灰度值HGFALSE为默认值
* 5) color: in, , cvtGray为HGFALSE时生效
* :
* 1) ROI区域, ROI区域的大小必须一致
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGImgProc_ImageHSVCorrect(HGImage image, HGImage destImage, HGUInt correctOption, HGBool cvtGray, HGColor color);
#endif /* __HGIMGPROC_H__ */