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();
        }

    }
}
 

更多推荐