imgproc增加HSV校正算法
This commit is contained in:
parent
71ae9ebcaf
commit
b11a238ec4
|
@ -15,6 +15,7 @@ HGImgProc_ImageDispersion
|
|||
HGImgProc_ImageFadeBkColor
|
||||
HGImgProc_ImageFilter
|
||||
HGImgProc_ImageOutHole
|
||||
HGImgProc_ImageHSVCorrect
|
||||
|
||||
HGImgProc_CreateOCRMgr
|
||||
HGImgProc_DestroyOCRMgr
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__ */
|
Loading…
Reference in New Issue