zoukankan      html  css  js  c++  java
  • emgu单通道多通道显示.txt

     public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            Mat chapter4Img = new Mat();
            System.Windows.Forms.OpenFileDialog chapter1OFD = new System.Windows.Forms.OpenFileDialog();
            private void ImageProcess()
            {
                if (chapter1OFD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    chapter4Img = CvInvoke.Imread(chapter1OFD.FileName, LoadImageType.AnyColor | LoadImageType.AnyDepth);
                Mat tempImg = new Mat();
                HisttoGram1D ht1D = new HisttoGram1D();
                if (chapter4Img.NumberOfChannels != 1)
                {
                    processimg();
                    //CvInvoke.CvtColor(chapter4Img, tempImg, ColorConversion.Bgr2Gray);
                    ////彩色转灰度 
                    //CvInvoke.NamedWindow("AJpg", NamedWindowType.AutoSize);
                    //CvInvoke.Imshow("AJpg", tempImg);
                }
                else {
                    tempImg = chapter4Img.Clone();
                }
            }
         

     private void Button_Click(object sender, RoutedEventArgs e)
            {
                ImageProcess();
            }


            //定义函数,输入Mat图像,输出DenseHistogram对象
            DenseHistogram[] getDenseHistogramDataOfImage(Mat inImg)
            //这里的inImg深度暂定为byte
            {
                DenseHistogram[] dh = new DenseHistogram[3]
                { new DenseHistogram(256, new RangeF(0f, 255.1f)),
                    new DenseHistogram(256, new RangeF(0f, 255.1f)),
                    new DenseHistogram(256, new RangeF(0f, 255.1f)) };
                if (inImg.NumberOfChannels==3)
                {
                    dh[0].Calculate(new Image<Gray, byte>[] { inImg.ToImage<Bgr, byte>()[0] }, false, null);
                    dh[1].Calculate(new Image<Gray, byte>[] { inImg.ToImage<Bgr, byte>()[1] }, false, null);
                    dh[2].Calculate(new Image<Gray, byte>[] { inImg.ToImage<Bgr, byte>()[2] }, false, null);
                }    else
                {
                     dh[0].Calculate(new Image<Gray, byte>[] { inImg.ToImage<Gray, byte>()[0] }, false, null);
                    dh[1] = null;
                    dh[2] = null;
                }
                return dh;
            }

    private void processimg()
            {
                if (chapter4Img.IsEmpty)
                    return;
                var dhData = getDenseHistogramDataOfImage(chapter4Img);
                //默认直方图256Bins,像素值方位[0.255]
                RangeF[] minValueAndMaxVlue = new RangeF[3];
                float minValue = 0.01f;
                //忽略数量少于minValue的箱子,定义数值范围0-1
                if (minValue < 0)
                    minValue = 0;
                else if (minValue > 1)
                    minValue = 1;
                minValue = chapter4Img.Rows * chapter4Img.Cols * minValue;
                //计算得到最小箱子
                for (int i = 0; i < dhData.Length; i++)
                {
                    if (dhData[i] == null)
                    {
                        minValueAndMaxVlue[i].Max = minValueAndMaxVlue[i].Min = -1f;
                        //及不存在这个通道的数据       
                        continue;
                    }

    for (; minValueAndMaxVlue[i].Min < dhData[i].GetBinValues().Length; minValueAndMaxVlue[i].Min += 1)
                    {
                        if (dhData[i].GetBinValues()[(int)minValueAndMaxVlue[i].Min] > minValue)
                            break;
                    }
                    minValueAndMaxVlue[i].Max = dhData[i].GetBinValues().Length - 1;
                    for (; minValueAndMaxVlue[i].Max >= 0; minValueAndMaxVlue[i].Max -= 1)
                    {
                        if (dhData[i].GetBinValues()[(int)minValueAndMaxVlue[i].Max] > minValue)
                            break;
                    }
                }
                var lut = new Image<Bgr, byte>(256, 1);
                List<byte[]> arrayData = new List<byte[]>();
                arrayData.Add(new byte[256]);
                arrayData.Add(new byte[256]);
                arrayData.Add(new byte[256]);
                if (chapter4Img.NumberOfChannels == 1)
                {
                    for (int i = 0; i < 256; i++)
                    {
                 if (i < minValueAndMaxVlue[0].Min)
                            arrayData[0][i] = 0;
                        else if (i > minValueAndMaxVlue[0].Max)
                            arrayData[0][i] = 255;
                        else
                            arrayData[0][i] = (byte)Math.Round(255.0 * (i - minValueAndMaxVlue[0].Min) / (minValueAndMaxVlue[0].Max - minValueAndMaxVlue[0].Min));
                    }
                }
                else

    //对每个通道进行计算,得到范围
                {
                    for (int index = 0; index < 3; index++)
                    {
                        arrayData[index] = new byte[256];
                        for (int i = 0; i < 256; i++)
                        {

                            if (i < minValueAndMaxVlue[index].Min)
                                arrayData[index][i] = 0;
                            else if (i > minValueAndMaxVlue[0].Max)
                                arrayData[index][i] = 255;
                            else
                                arrayData[index][i] = (byte)Math.Round(255.0 * (i - minValueAndMaxVlue[index].Min) / (minValueAndMaxVlue[index].Max - minValueAndMaxVlue[0].Min));
                        }
                    }
                }
                for (int i = 0; i < 256; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        lut.Data[0, i, j] = arrayData[j][i];
                    }
                }
              Mat resultImg = new Mat(); if (chapter4Img.NumberOfChannels == 1)
                { CvInvoke.LUT(chapter4Img, lut.Split()[0].Mat, resultImg); }
                else { CvInvoke.LUT(chapter4Img, lut.Split()[0].Mat, resultImg); }
                CvInvoke.NamedWindow("Based on One Channel (Blue)", NamedWindowType.Normal);
                CvInvoke.Imshow("Based on One Channel (Blue)", resultImg);
                //对所有的通道取同样的minValueAndMaxValue范围计算 
                arrayData.Add(new byte[256]);
                //再加一个数组 
                int newMinValue = Math.Min((int)Math.Min(minValueAndMaxVlue[0].Min, minValueAndMaxVlue[1].Min), (int)minValueAndMaxVlue[2].Min);
                int newMaxValue = Math.Max((int)Math.Max(minValueAndMaxVlue[0].Max, minValueAndMaxVlue[1].Max), (int)minValueAndMaxVlue[2].Max);
                for (int i = 0; i < 256; i++)
                {
                    if (i < newMinValue)
                        arrayData[3][i] = 0;
                    else if (i > newMaxValue)
                      arrayData[3][i] = (byte)((255.0 * (i - newMinValue) / (newMaxValue - newMinValue)));
                }
                var newLut = new Mat(1, 256, DepthType.Cv8U, 1);
                newLut.SetTo(arrayData[3]);
                if (chapter4Img.NumberOfChannels == 3)
                {
                    CvInvoke.LUT(chapter4Img, newLut, resultImg);
                    CvInvoke.NamedWindow("Based on BGR three Channels", NamedWindowType.KeepRatio);
                    CvInvoke.Imshow("Based on BGR three Channels", resultImg);
                }
                else
                {
                    CvInvoke.LUT(chapter4Img, lut.Split()[0].Mat, resultImg);
                    CvInvoke.NamedWindow("Based on One Channel", NamedWindowType.KeepRatio);
                    CvInvoke.Imshow("Based on One Channel", resultImg);
                }

     }
        }

        public class HisttoGram1D
        {
            private int[] channels = new int[1];
            //使用的通道index  
            int[] histSize = new int[1];//bin数量 
            RangeF[] ranges = new RangeF[1];//像素值范围   
            Mat mask = new Mat();//掩码
            Mat hist = new Mat();//得到的直方图数据 
            public HisttoGram1D()
            {
                channels[0] = 0;
                histSize[0] = 256;
                ranges[0] = new RangeF(0.0f, 255.1f);
            }

     public DenseHistogram getDenseHistogram(Mat inImg)
            {
                if (inImg.IsEmpty)
                {
                    return null;
                }
                DenseHistogram dh = new DenseHistogram(histSize, ranges);
                var imgs = inImg.ToImage<Gray, byte>().Split();
                dh.Calculate(imgs, false, null);
                //计算直方图信息     
                return dh;
            }
        }

  • 相关阅读:
    G
    C
    B
    B
    线段树模板
    网络流模板
    POJ_1631_Bridging_Signals_(动态规划,LIS)
    POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)
    BZOJ_1015_星球大战_[JSOI2008]_(并查集)
    POJ_3280_Cheapest_Palindrome_(动态规划)
  • 原文地址:https://www.cnblogs.com/yuanchao/p/12576966.html
Copyright © 2011-2022 走看看