一、效果
说明:之前的EMGU.CV 版本都是3.3.0.2824 ,比较古老,没有Scharr算子
而最新的4.5.3.4721 没有转换bitmap的方法
最后比较一下,之后使用的版本为4.1.0.3408
二、代码
// 1. 加载原图
var image1 = new Image<Bgr, byte>("bird1.png");
var image0 = image1.Mat.Clone();
PreviewImage1 = new WriteableBitmap(Bitmap2BitmapImage(Text(image1.Bitmap, "原图")));
// 2. 转为灰度(当然也可以直接读取为灰度)
Mat image2 = new Mat();
CvInvoke.CvtColor(image0.Clone(), image2, ColorConversion.Bgr2Gray);
PreviewImage2 = new WriteableBitmap(Bitmap2BitmapImage(Text(image2.Bitmap, "灰度")));
// 3. 自动阈值
Mat image3 = new Mat();
CvInvoke.Threshold(image2, image3, 0, 255, ThresholdType.Otsu);
PreviewImage3 = new WriteableBitmap(Bitmap2BitmapImage(Text(image3.Bitmap, "Otsu阈值")));
// 4. sobel算子
Mat image4 = new Mat();
CvInvoke.Sobel(image3.Clone(), image4, DepthType.Cv64F, 1, 0, 3);
CvInvoke.ConvertScaleAbs(image4, image4, 1.0, 0);
Mat image5 = new Mat();
CvInvoke.Sobel(image3.Clone(), image5, DepthType.Cv64F, 0, 1, 3);
CvInvoke.ConvertScaleAbs(image5, image5, 1.0, 0);
var image6 = new Mat();
CvInvoke.AddWeighted(image4, 0.5, image5, 0.5, 0, image6);
PreviewImage4 = new WriteableBitmap(Bitmap2BitmapImage(Text2(image6.Bitmap, "sobel算子")));
// 5. Scharr算子
Mat image7 = new Mat();
Mat image9 = new Mat();
CvInvoke.Scharr(image3.Clone(),image7,DepthType.Cv64F,1,0,3);
CvInvoke.Scharr(image3.Clone(), image9, DepthType.Cv64F, 0, 1, 3);
CvInvoke.ConvertScaleAbs(image7, image7, 1.0, 0);
CvInvoke.ConvertScaleAbs(image9, image9, 1.0, 0);
var image10 = new Mat();
CvInvoke.AddWeighted(image7, 0.5, image9, 0.5, 0, image10);
PreviewImage5 = new WriteableBitmap(Bitmap2BitmapImage(Text2(image10.Bitmap, "Scharr算子")));
// 6. Laplacian算子
Mat image8 = new Mat();
CvInvoke.Laplacian(image3.Clone(), image8, DepthType.Cv64F);
CvInvoke.ConvertScaleAbs(image8, image8, 1.0, 0);
PreviewImage6 = new WriteableBitmap(Bitmap2BitmapImage(Text2(image8.Bitmap, "Laplacian算子")));