imgproc增加图像去污接口
This commit is contained in:
parent
b11a238ec4
commit
bbdf86a24e
|
@ -16,6 +16,7 @@ HGImgProc_ImageFadeBkColor
|
||||||
HGImgProc_ImageFilter
|
HGImgProc_ImageFilter
|
||||||
HGImgProc_ImageOutHole
|
HGImgProc_ImageOutHole
|
||||||
HGImgProc_ImageHSVCorrect
|
HGImgProc_ImageHSVCorrect
|
||||||
|
HGImgProc_ImageDecontamination
|
||||||
|
|
||||||
HGImgProc_CreateOCRMgr
|
HGImgProc_CreateOCRMgr
|
||||||
HGImgProc_DestroyOCRMgr
|
HGImgProc_DestroyOCRMgr
|
||||||
|
|
|
@ -105,10 +105,10 @@ BOOL CHGTestDlg::OnInitDialog()
|
||||||
SetIcon(m_hIcon, FALSE); // 设置小图标
|
SetIcon(m_hIcon, FALSE); // 设置小图标
|
||||||
|
|
||||||
HGImage img = NULL;
|
HGImage img = NULL;
|
||||||
HGImgFmt_LoadImage("D:\\1.jpg", 0, NULL, HGBASE_IMGTYPE_BINARY, HGBASE_IMGORIGIN_TOP, &img);
|
HGImgFmt_LoadImage("D:\\1.jpg", 0, NULL, HGBASE_IMGTYPE_BGRA, HGBASE_IMGORIGIN_BOTTOM, &img);
|
||||||
if (NULL != img)
|
if (NULL != img)
|
||||||
{
|
{
|
||||||
HGImgProc_ImageHSVCorrect(img, img, HGIMGPROC_CORRECTOPTION_LOWSATURATION_REMOVAL, HGTRUE, HG_MAKECOLOR(255, 0, 0, 0));
|
HGImgProc_ImageDecontamination(img, img, HGIMGPROC_DECOTYPE_INSIDE, 100, 200, 300, 500, HG_MAKECOLOR(255, 0, 0, 0));
|
||||||
|
|
||||||
HGImgFmt_SaveImage(img, 0, NULL, "D:\\222.bmp");
|
HGImgFmt_SaveImage(img, 0, NULL, "D:\\222.bmp");
|
||||||
HGBase_DestroyImage(img);
|
HGBase_DestroyImage(img);
|
||||||
|
|
|
@ -138,7 +138,7 @@
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../Debug/HGImgProc.lib;../../../../sdk/lib/win/x86/Debug/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurld.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../Debug/HGImgProc.lib;../../../../sdk/lib/win/x86/Release/sane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurld.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalOptions>/ignore:4098,4099,4075 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/ignore:4098,4099,4075 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
@ -158,7 +158,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGImgProc.lib;../../../../sdk/lib/win/x86/Release/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGImgProc.lib;../../../../sdk/lib/win/x86/Release/sane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
@ -177,7 +177,7 @@
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../x64/Debug/HGImgProc.lib;../../../../sdk/lib/win/x64/Debug/hgsane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../x64/Debug/HGImgProc.lib;../../../../sdk/lib/win/x64/Release/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalOptions>/ignore:4098,4099,4075 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/ignore:4098,4099,4075 /LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
@ -197,7 +197,7 @@
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../x64/Release/HGImgProc.lib;../../../../sdk/lib/win/x64/Release/hgsane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../x64/Release/HGImgProc.lib;../../../../sdk/lib/win/x64/Release/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
|
|
@ -1353,3 +1353,330 @@ HGResult HGAPI HGImgProc_ImageHSVCorrect(HGImage image, HGImage destImage, HGUIn
|
||||||
|
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HGResult HGAPI HGImgProc_ImageDecontamination(HGImage image, HGImage destImage, HGUInt decoType, HGUInt x, HGUInt y,
|
||||||
|
HGUInt width, HGUInt height, HGColor color)
|
||||||
|
{
|
||||||
|
if (NULL == image || decoType < HGIMGPROC_DECOTYPE_INSIDE || decoType > HGIMGPROC_DECOTYPE_OUTSIDE
|
||||||
|
|| 0 == width || 0 == height)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGImageInfo imgInfo;
|
||||||
|
HGBase_GetImageInfo(image, &imgInfo);
|
||||||
|
|
||||||
|
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 (x + width > roiWidth || y + height > roiHeight)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t channels = 1;
|
||||||
|
if (HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_RGB == imgInfo.type)
|
||||||
|
channels = 3;
|
||||||
|
else if (HGBASE_IMGTYPE_BGRA == imgInfo.type || HGBASE_IMGTYPE_RGBA == imgInfo.type)
|
||||||
|
channels = 4;
|
||||||
|
uint32_t dataSize = roiWidth * channels;
|
||||||
|
|
||||||
|
HGUInt r = HG_GETCOLOR_R(color);
|
||||||
|
HGUInt g = HG_GETCOLOR_G(color);
|
||||||
|
HGUInt b = HG_GETCOLOR_B(color);
|
||||||
|
HGUInt v = (r * 76 + g * 150 + b * 30) >> 8;
|
||||||
|
|
||||||
|
if (NULL == destImage || image == destImage)
|
||||||
|
{
|
||||||
|
if (HGBASE_IMGTYPE_BINARY == imgInfo.type)
|
||||||
|
{
|
||||||
|
HGImage imageTmp = NULL;
|
||||||
|
HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_GRAY, 0, &imageTmp);
|
||||||
|
if (HGBASE_ERR_OK == ret)
|
||||||
|
{
|
||||||
|
ret = HGImgProc_ImageDecontamination(imageTmp, imageTmp, decoType, x, y, width, height, color);
|
||||||
|
if (HGBASE_ERR_OK == ret)
|
||||||
|
{
|
||||||
|
ret = HGBase_CopyImage(imageTmp, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
HGBase_DestroyImage(imageTmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGByte* p = data + (HGUSize)roi.top * (HGUSize)imgInfo.widthStep + roi.left * channels;
|
||||||
|
HGInt step = (HGInt)imgInfo.widthStep;
|
||||||
|
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
|
||||||
|
{
|
||||||
|
p = data + (HGUSize)(imgInfo.height - roi.top - 1) * (HGUSize)imgInfo.widthStep + roi.left * channels;
|
||||||
|
step = -(HGInt)imgInfo.widthStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HGBASE_IMGTYPE_RGB == imgInfo.type || HGBASE_IMGTYPE_RGBA == imgInfo.type
|
||||||
|
|| HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_BGRA == imgInfo.type)
|
||||||
|
{
|
||||||
|
if (HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_BGRA == imgInfo.type)
|
||||||
|
{
|
||||||
|
r = HG_GETCOLOR_B(color);
|
||||||
|
g = HG_GETCOLOR_G(color);
|
||||||
|
b = HG_GETCOLOR_R(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HGIMGPROC_DECOTYPE_INSIDE == decoType)
|
||||||
|
{
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pEx = p + (HGSize)i * (HGSize)step;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pEx2 = pEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
{
|
||||||
|
pEx2[0] = r;
|
||||||
|
pEx2[1] = g;
|
||||||
|
pEx2[2] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGIMGPROC_DECOTYPE_OUTSIDE == decoType);
|
||||||
|
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pEx = p + (HGSize)i * (HGSize)step;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pEx2 = pEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pEx2[0] = r;
|
||||||
|
pEx2[1] = g;
|
||||||
|
pEx2[2] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGBASE_IMGTYPE_GRAY == imgInfo.type);
|
||||||
|
|
||||||
|
if (HGIMGPROC_DECOTYPE_INSIDE == decoType)
|
||||||
|
{
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pEx = p + (HGSize)i * (HGSize)step;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pEx2 = pEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
*pEx2 = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGIMGPROC_DECOTYPE_OUTSIDE == decoType);
|
||||||
|
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pEx = p + (HGSize)i * (HGSize)step;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pEx2 = pEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*pEx2 = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HGImageInfo destImgInfo;
|
||||||
|
HGBase_GetImageInfo(destImage, &destImgInfo);
|
||||||
|
if (imgInfo.type != destImgInfo.type)
|
||||||
|
{
|
||||||
|
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_BINARY == imgInfo.type)
|
||||||
|
{
|
||||||
|
HGImage imageTmp = NULL;
|
||||||
|
HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_GRAY, 0, &imageTmp);
|
||||||
|
if (HGBASE_ERR_OK == ret)
|
||||||
|
{
|
||||||
|
ret = HGImgProc_ImageDecontamination(imageTmp, imageTmp, decoType, x, y, width, height, color);
|
||||||
|
if (HGBASE_ERR_OK == ret)
|
||||||
|
{
|
||||||
|
ret = HGBase_CopyImage(imageTmp, destImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
HGBase_DestroyImage(imageTmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGByte* src = data + (HGUSize)roi.top * (HGUSize)imgInfo.widthStep + roi.left * channels;
|
||||||
|
HGInt srcStep = (HGInt)imgInfo.widthStep;
|
||||||
|
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
|
||||||
|
{
|
||||||
|
src = data + (HGUSize)(imgInfo.height - roi.top - 1) * (HGUSize)imgInfo.widthStep + roi.left * channels;
|
||||||
|
srcStep = -(HGInt)imgInfo.widthStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGByte* dest = destData + (HGUSize)destRoi.top * (HGUSize)destImgInfo.widthStep + destRoi.left * channels;
|
||||||
|
HGInt destStep = (HGInt)destImgInfo.widthStep;
|
||||||
|
if (HGBASE_IMGORIGIN_BOTTOM == destImgInfo.origin)
|
||||||
|
{
|
||||||
|
dest = destData + (HGUSize)(destImgInfo.height - destRoi.top - 1) * (HGUSize)destImgInfo.widthStep + destRoi.left * channels;
|
||||||
|
destStep = -(HGInt)destImgInfo.widthStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HGBASE_IMGTYPE_RGB == imgInfo.type || HGBASE_IMGTYPE_RGBA == imgInfo.type
|
||||||
|
|| HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_BGRA == imgInfo.type)
|
||||||
|
{
|
||||||
|
if (HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_BGRA == imgInfo.type)
|
||||||
|
{
|
||||||
|
r = HG_GETCOLOR_B(color);
|
||||||
|
g = HG_GETCOLOR_G(color);
|
||||||
|
b = HG_GETCOLOR_R(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HGIMGPROC_DECOTYPE_INSIDE == decoType)
|
||||||
|
{
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx = src + (HGSize)i * (HGSize)srcStep;
|
||||||
|
HGByte* pDestEx = dest + (HGSize)i * (HGSize)destStep;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx2 = pSrcEx + j * channels;
|
||||||
|
HGByte* pDestEx2 = pDestEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
{
|
||||||
|
pDestEx2[0] = r;
|
||||||
|
pDestEx2[1] = g;
|
||||||
|
pDestEx2[2] = b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pDestEx2[0] = pSrcEx2[0];
|
||||||
|
pDestEx2[1] = pSrcEx2[1];
|
||||||
|
pDestEx2[2] = pSrcEx2[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGIMGPROC_DECOTYPE_OUTSIDE == decoType);
|
||||||
|
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx = src + (HGSize)i * (HGSize)srcStep;
|
||||||
|
HGByte* pDestEx = dest + (HGSize)i * (HGSize)destStep;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx2 = pSrcEx + j * channels;
|
||||||
|
HGByte* pDestEx2 = pDestEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
{
|
||||||
|
pDestEx2[0] = pSrcEx2[0];
|
||||||
|
pDestEx2[1] = pSrcEx2[1];
|
||||||
|
pDestEx2[2] = pSrcEx2[2];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pDestEx2[0] = r;
|
||||||
|
pDestEx2[1] = g;
|
||||||
|
pDestEx2[2] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGBASE_IMGTYPE_GRAY == imgInfo.type);
|
||||||
|
|
||||||
|
if (HGIMGPROC_DECOTYPE_INSIDE == decoType)
|
||||||
|
{
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx = src + (HGSize)i * (HGSize)srcStep;
|
||||||
|
HGByte* pDestEx = dest + (HGSize)i * (HGSize)destStep;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx2 = pSrcEx + j * channels;
|
||||||
|
HGByte* pDestEx2 = pDestEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
*pDestEx2 = v;
|
||||||
|
else
|
||||||
|
*pDestEx2 = *pSrcEx2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(HGIMGPROC_DECOTYPE_OUTSIDE == decoType);
|
||||||
|
|
||||||
|
//#pragma omp parallel for
|
||||||
|
for (int32_t i = 0; i < (int32_t)roiHeight; ++i)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx = src + (HGSize)i * (HGSize)srcStep;
|
||||||
|
HGByte* pDestEx = dest + (HGSize)i * (HGSize)destStep;
|
||||||
|
for (int32_t j = 0; j < (int32_t)roiWidth; ++j)
|
||||||
|
{
|
||||||
|
HGByte* pSrcEx2 = pSrcEx + j * channels;
|
||||||
|
HGByte* pDestEx2 = pDestEx + j * channels;
|
||||||
|
if ((j >= (int32_t)x && j < (int32_t)(x + width)) && (i >= (int32_t)y && i < (int32_t)(y + height)))
|
||||||
|
*pDestEx2 = *pSrcEx2;
|
||||||
|
else
|
||||||
|
*pDestEx2 = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -94,6 +94,11 @@
|
||||||
/* 除掉红色。红色定义H:[0, 85]∪[170, 255],S:[10, 255],V:[120,255] */
|
/* 除掉红色。红色定义H:[0, 85]∪[170, 255],S:[10, 255],V:[120,255] */
|
||||||
#define HGIMGPROC_CORRECTOPTION_RED_REMOVAL 3L
|
#define HGIMGPROC_CORRECTOPTION_RED_REMOVAL 3L
|
||||||
|
|
||||||
|
/* 内部去污 */
|
||||||
|
#define HGIMGPROC_DECOTYPE_INSIDE 1L
|
||||||
|
/* 外部去污 */
|
||||||
|
#define HGIMGPROC_DECOTYPE_OUTSIDE 2L
|
||||||
|
|
||||||
/* 自动裁剪参数 */
|
/* 自动裁剪参数 */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -320,4 +325,21 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageOutHole(HGImage image1, HGImage image2, H
|
||||||
*/
|
*/
|
||||||
HGEXPORT HGResult HGAPI HGImgProc_ImageHSVCorrect(HGImage image, HGImage destImage, HGUInt correctOption, HGBool cvtGray, HGColor color);
|
HGEXPORT HGResult HGAPI HGImgProc_ImageHSVCorrect(HGImage image, HGImage destImage, HGUInt correctOption, HGBool cvtGray, HGColor color);
|
||||||
|
|
||||||
|
/* 图像去污
|
||||||
|
* 1) image: in, 源图像句柄
|
||||||
|
* 2) destImage: in, 目标图像句柄
|
||||||
|
* 3) decoType: in, 去污类型, 参见HGIMGPROC_DECOTYPE_*
|
||||||
|
* 4) x: in, 选择区域的x坐标
|
||||||
|
* 5) y: in, 选择区域的y坐标
|
||||||
|
* 6) width: in, 选择区域的宽
|
||||||
|
* 7) height: in, 选择区域的高
|
||||||
|
* 说明:
|
||||||
|
* 1) 操作的只是图像的ROI区域, ROI区域的大小必须一致
|
||||||
|
* 2) 源图像和目标图像的type必须一样
|
||||||
|
* 3) 自动处理origon不一致的情况
|
||||||
|
* 4) image和destImage可以是同一个句柄
|
||||||
|
*/
|
||||||
|
HGEXPORT HGResult HGAPI HGImgProc_ImageDecontamination(HGImage image, HGImage destImage, HGUInt decoType, HGUInt x, HGUInt y,
|
||||||
|
HGUInt width, HGUInt height, HGColor color);
|
||||||
|
|
||||||
#endif /* __HGIMGPROC_H__ */
|
#endif /* __HGIMGPROC_H__ */
|
Loading…
Reference in New Issue