机器视觉通用平台之图像预处理算法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HalconDotNet;
namespace CvImageTool
{
public class SubImagePreprocess
{
#region scale_image_range算法
public static void scale_image_range(HObject ho_Image, out HObject ho_ImageScaled, HTuple hv_Min, HTuple hv_Max)
{
// Stack for temporary objects
HObject[] OTemp = new HObject[20];
// Local iconic variables
HObject ho_ImageSelected = null, ho_SelectedChannel = null;
HObject ho_LowerRegion = null, ho_UpperRegion = null, ho_ImageSelectedScaled = null;
// Local copy input parameter variables
HObject ho_Image_COPY_INP_TMP;
ho_Image_COPY_INP_TMP = new HObject(ho_Image);
// Local control variables
HTuple hv_LowerLimit = new HTuple(), hv_UpperLimit = new HTuple();
HTuple hv_Mult = new HTuple(), hv_Add = new HTuple(), hv_NumImages = new HTuple();
HTuple hv_ImageIndex = new HTuple(), hv_Channels = new HTuple();
HTuple hv_ChannelIndex = new HTuple(), hv_MinGray = new HTuple();
HTuple hv_MaxGray = new HTuple(), hv_Range = new HTuple();
HTuple hv_Max_COPY_INP_TMP = new HTuple(hv_Max);
HTuple hv_Min_COPY_INP_TMP = new HTuple(hv_Min);
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_ImageScaled);
HOperatorSet.GenEmptyObj(out ho_ImageSelected);
HOperatorSet.GenEmptyObj(out ho_SelectedChannel);
HOperatorSet.GenEmptyObj(out ho_LowerRegion);
HOperatorSet.GenEmptyObj(out ho_UpperRegion);
HOperatorSet.GenEmptyObj(out ho_ImageSelectedScaled);
if ((int)(new HTuple((new HTuple(hv_Min_COPY_INP_TMP.TupleLength())).TupleEqual(2))) != 0)
{
hv_LowerLimit.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_LowerLimit = hv_Min_COPY_INP_TMP.TupleSelect(1);
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple ExpTmpLocalVar_Min = hv_Min_COPY_INP_TMP.TupleSelect(0);
hv_Min_COPY_INP_TMP.Dispose();
hv_Min_COPY_INP_TMP = ExpTmpLocalVar_Min;
}
}
}
else
{
hv_LowerLimit.Dispose();
hv_LowerLimit = 0.0;
}
if ((int)(new HTuple((new HTuple(hv_Max_COPY_INP_TMP.TupleLength())).TupleEqual(2))) != 0)
{
hv_UpperLimit.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_UpperLimit = hv_Max_COPY_INP_TMP.TupleSelect(1);
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple ExpTmpLocalVar_Max = hv_Max_COPY_INP_TMP.TupleSelect(0);
hv_Max_COPY_INP_TMP.Dispose();
hv_Max_COPY_INP_TMP = ExpTmpLocalVar_Max;
}
}
}
else
{
hv_UpperLimit.Dispose();
hv_UpperLimit = 255.0;
}
//
//Calculate scaling parameters.
hv_Mult.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_Mult = (((hv_UpperLimit - hv_LowerLimit)).TupleReal()) / (hv_Max_COPY_INP_TMP - hv_Min_COPY_INP_TMP);
}
hv_Add.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_Add = ((-hv_Mult) * hv_Min_COPY_INP_TMP) + hv_LowerLimit;
}
//
//Scale image.
{
HObject ExpTmpOutVar_0;
HOperatorSet.ScaleImage(ho_Image_COPY_INP_TMP, out ExpTmpOutVar_0, hv_Mult, hv_Add);
ho_Image_COPY_INP_TMP.Dispose();
ho_Image_COPY_INP_TMP = ExpTmpOutVar_0;
}
//
//Clip gray values if necessary.
//This must be done for each image and channel separately.
ho_ImageScaled.Dispose();
HOperatorSet.GenEmptyObj(out ho_ImageScaled);
hv_NumImages.Dispose();
HOperatorSet.CountObj(ho_Image_COPY_INP_TMP, out hv_NumImages);
HTuple end_val49 = hv_NumImages;
HTuple step_val49 = 1;
for (hv_ImageIndex = 1; hv_ImageIndex.Continue(end_val49, step_val49); hv_ImageIndex = hv_ImageIndex.TupleAdd(step_val49))
{
ho_ImageSelected.Dispose();
HOperatorSet.SelectObj(ho_Image_COPY_INP_TMP, out ho_ImageSelected, hv_ImageIndex);
hv_Channels.Dispose();
HOperatorSet.CountChannels(ho_ImageSelected, out hv_Channels);
HTuple end_val52 = hv_Channels;
HTuple step_val52 = 1;
for (hv_ChannelIndex = 1; hv_ChannelIndex.Continue(end_val52, step_val52); hv_ChannelIndex = hv_ChannelIndex.TupleAdd(step_val52))
{
ho_SelectedChannel.Dispose();
HOperatorSet.AccessChannel(ho_ImageSelected, out ho_SelectedChannel, hv_ChannelIndex);
hv_MinGray.Dispose(); hv_MaxGray.Dispose(); hv_Range.Dispose();
HOperatorSet.MinMaxGray(ho_SelectedChannel, ho_SelectedChannel, 0, out hv_MinGray,
out hv_MaxGray, out hv_Range);
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
ho_LowerRegion.Dispose();
HOperatorSet.Threshold(ho_SelectedChannel, out ho_LowerRegion, ((hv_MinGray.TupleConcat(hv_LowerLimit))).TupleMin(), hv_LowerLimit);
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
ho_UpperRegion.Dispose();
HOperatorSet.Threshold(ho_SelectedChannel, out ho_UpperRegion, hv_UpperLimit, ((hv_UpperLimit.TupleConcat(hv_MaxGray))).TupleMax());
}
{
HObject ExpTmpOutVar_0;
HOperatorSet.PaintRegion(ho_LowerRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_LowerLimit, "fill");
ho_SelectedChannel.Dispose();
ho_SelectedChannel = ExpTmpOutVar_0;
}
{
HObject ExpTmpOutVar_0;
HOperatorSet.PaintRegion(ho_UpperRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_UpperLimit, "fill");
ho_SelectedChannel.Dispose();
ho_SelectedChannel = ExpTmpOutVar_0;
}
if ((int)(new HTuple(hv_ChannelIndex.TupleEqual(1))) != 0)
{
ho_ImageSelectedScaled.Dispose();
HOperatorSet.CopyObj(ho_SelectedChannel, out ho_ImageSelectedScaled, 1, 1);
}
else
{
{
HObject ExpTmpOutVar_0;
HOperatorSet.AppendChannel(ho_ImageSelectedScaled, ho_SelectedChannel, out ExpTmpOutVar_0);
ho_ImageSelectedScaled.Dispose();
ho_ImageSelectedScaled = ExpTmpOutVar_0;
}
}
}
{
HObject ExpTmpOutVar_0;
HOperatorSet.ConcatObj(ho_ImageScaled, ho_ImageSelectedScaled, out ExpTmpOutVar_0);
ho_ImageScaled.Dispose();
ho_ImageScaled = ExpTmpOutVar_0;
}
}
ho_Image_COPY_INP_TMP.Dispose();
ho_ImageSelected.Dispose();
ho_SelectedChannel.Dispose();
ho_LowerRegion.Dispose();
ho_UpperRegion.Dispose();
ho_ImageSelectedScaled.Dispose();
hv_Max_COPY_INP_TMP.Dispose();
hv_Min_COPY_INP_TMP.Dispose();
hv_LowerLimit.Dispose();
hv_UpperLimit.Dispose();
hv_Mult.Dispose();
hv_Add.Dispose();
hv_NumImages.Dispose();
hv_ImageIndex.Dispose();
hv_Channels.Dispose();
hv_ChannelIndex.Dispose();
hv_MinGray.Dispose();
hv_MaxGray.Dispose();
hv_Range.Dispose();
return;
}
#endregion
public static void Rgb1ToGray(HObject image, HObject region, out HObject grayImage, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.Rgb1ToGray(optImage, out grayImage);
if(isReduceDoman)reduceImage.Dispose();
}
public static void Decompose3(HObject image, HObject region, out HObject bImage, out HObject gImage, out HObject rImage, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.Decompose3(optImage, out bImage, out gImage, out rImage);
if (isReduceDoman) reduceImage.Dispose();
}
public static void MeanImage(HObject image, HObject region, out HObject meanImage, HTuple maskWidth, HTuple maskHeight, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.MeanImage(optImage, out meanImage, maskWidth, maskHeight);
if (isReduceDoman) reduceImage.Dispose();
}
public static void MedianImage(HObject image, HObject region, out HObject medianImage, HTuple maskType, HTuple radius, HTuple margin, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.MedianImage(optImage, out medianImage, maskType, radius, margin);
if (isReduceDoman) reduceImage.Dispose();
}
public static void ScaleImageRange(HObject image, HObject region, out HObject scaleImage, HTuple max, HTuple min, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
SubImagePreprocess.scale_image_range(optImage, out scaleImage, min, max);
if (isReduceDoman) reduceImage.Dispose();
}
public static void ScaleImage(HObject image, HObject region, out HObject scaleImage, bool isReduceDoman)
{
HOperatorSet.MinMaxGray(region, image, 0, out HTuple min, out HTuple max, out HTuple range);
HTuple mult = 255.0 / range.D;
HTuple add = -mult * min.D;
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.ScaleImage(optImage, out scaleImage, mult, add);
if (isReduceDoman) reduceImage.Dispose();
}
public static void Emphasize(HObject image, HObject region, out HObject emphasizeImage, HTuple maskHeight, HTuple maskWidth, HTuple factor, bool isReduceDoman)
{
HObject reduceImage = null;
HObject optImage = image;
if (isReduceDoman)
{
HOperatorSet.ReduceDomain(optImage, region, out reduceImage);
optImage = reduceImage;
}
HOperatorSet.Emphasize(optImage, out emphasizeImage, maskWidth, maskHeight, factor);
if (isReduceDoman) reduceImage.Dispose();
}
}
}
更多推荐


所有评论(0)