コード例 #1
0
        private void EdgeDetect()
        {
            if (_image != null)
            {
                try
                {
                    if (_isChecked)
                    {
                        _progressValue = 0;
                        base.OnPropertyChanged("ProgressValue");

                        Bitmap _bmpImage = BitmapConvert.BitmapImageToBitmap(_image);

                        Bitmap edge;
                        Canny.DetectCannyEdges(_bmpImage, out edge, _kernelSize, _sigma, _thrHigh, _thrLow);

                        _cannyImage = BitmapConvert.toBitmapImage(edge);
                        base.OnPropertyChanged("CannyImage");

                        Bitmap gf, np, se, we;
                        Canny.GaussianFilter(_bmpImage, out gf, _kernelSize, _sigma);
                        _GFImage = BitmapConvert.toBitmapImage(gf);
                        base.OnPropertyChanged("GFImage");

                        Canny.Suppression(_bmpImage, out np, _kernelSize, _sigma);
                        _NMSImage = BitmapConvert.toBitmapImage(np);
                        base.OnPropertyChanged("NMSImage");

                        Canny.Threshold(_bmpImage, out se, out we, _kernelSize, _sigma, _thrHigh, _thrLow);
                        _WEImage = BitmapConvert.toBitmapImage(we);
                        base.OnPropertyChanged("WEImage");
                        _SEImage = BitmapConvert.toBitmapImage(se);
                        base.OnPropertyChanged("SEImage");
                    }
                    else
                    {
                        Bitmap _bmpImage = BitmapConvert.BitmapImageToBitmap(_image);
                        //获得灰度图
                        Image <Gray, byte> grayFrame = new Image <Gray, byte>(_bmpImage);


                        if (_equalizeHist)
                        {
                            grayFrame._EqualizeHist();//autocontrast
                        }
                        //高斯平滑
                        Image <Gray, byte> smoothedGrayFrame = grayFrame.PyrDown();
                        smoothedGrayFrame = smoothedGrayFrame.PyrUp();

                        //canny
                        Image <Gray, byte> cannyFrame = null;
                        if (_smooth)
                        {
                            cannyFrame = smoothedGrayFrame.Canny(_thresh, _threshLinking);
                            grayFrame  = smoothedGrayFrame;
                        }
                        else
                        {
                            grayFrame = grayFrame.Canny(_thresh, _threshLinking);
                        }

                        //局部自适应阈值二值化,阈值本身作为了一个变量,检测更有效
                        //CvInvoke.cvAdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, adaptiveThresholdBlockSize + adaptiveThresholdBlockSize % 2 + 1, adaptiveThresholdParameter);
                        CvInvoke.AdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.MeanC, Emgu.CV.CvEnum.ThresholdType.Binary, _blockSize + _blockSize % 2 + 1, _parameter);

                        //
                        grayFrame._Not();
                        //
                        if (cannyFrame != null)
                        {
                            grayFrame._Or(cannyFrame);    //试验了一下,这样轮廓会更加明显
                        }
                        _cannyImage = BitmapConvert.toBitmapImage(grayFrame.ToBitmap());
                        base.OnPropertyChanged("CannyImage");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }