一、目的
测试几种不同滤波的使用方式和效果
gitee地址
二、配置
见文章一
三、主要逻辑
四、代码
4.1 mainviewmodel
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Media.Imaging;
namespace Demo
{
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private WriteableBitmap _previewImage1;
public WriteableBitmap PreviewImage1
{
get { return _previewImage1; }
set { _previewImage1 = value; PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("")); }
}
private WriteableBitmap _previewImage2;
public WriteableBitmap PreviewImage2
{
get { return _previewImage2; }
set { _previewImage2 = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); }
}
private WriteableBitmap _previewImage3;
public WriteableBitmap PreviewImage3
{
get { return _previewImage3; }
set { _previewImage3 = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); }
}
private WriteableBitmap _previewImage4;
public WriteableBitmap PreviewImage4
{
get { return _previewImage4; }
set { _previewImage4 = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); }
}
private WriteableBitmap _previewImage5;
public WriteableBitmap PreviewImage5
{
get { return _previewImage5; }
set { _previewImage5 = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); }
}
private WriteableBitmap _previewImage6;
public WriteableBitmap PreviewImage6
{
get { return _previewImage6; }
set { _previewImage6 = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); }
}
public MainViewModel() {
ImageProcess();
}
private BitmapImage Bitmap2BitmapImage(Bitmap bitmap ) {
using (MemoryStream ms = new MemoryStream()) {
bitmap.Save(ms,ImageFormat.Bmp);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.EndInit();
bi.Freeze();
return bi;
}
}
private void ImageProcess()
{
// 1. 加载原图
Mat image1 = CvInvoke.Imread("test.png");
PreviewImage1 = new WriteableBitmap(Bitmap2BitmapImage(image1.Bitmap));
// 2. 中值滤波
Mat image2 = new Mat();
CvInvoke.MedianBlur(image1,image2,1);
PreviewImage2 = new WriteableBitmap(Bitmap2BitmapImage(image2.Bitmap));
// 3. 均值滤波
Mat image3 = new Mat();
CvInvoke.Blur(image1, image3, new Size(10,10),new Point(-1,-1));
PreviewImage3 = new WriteableBitmap(Bitmap2BitmapImage(image3.Bitmap));
// 4. 高斯滤波
Mat image4 = new Mat();
CvInvoke.GaussianBlur(image1, image4, new Size(5, 5), 4);
PreviewImage4 = new WriteableBitmap(Bitmap2BitmapImage(image4.Bitmap));
// 5. 双边滤波
Mat image5 = new Mat();
CvInvoke.BilateralFilter(image1, image5, 10,30,15);
PreviewImage5 = new WriteableBitmap(Bitmap2BitmapImage(image5.Bitmap));
// 6. 方框滤波
Mat image6 = new Mat();
CvInvoke.BoxFilter(image1, image6, DepthType.Cv8U,new Size(5,5),new Point(-1,-1));
PreviewImage6 = new WriteableBitmap(Bitmap2BitmapImage(image6.Bitmap));
}
}
}
4.2 xaml
<Window x:Class="Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Demo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<!--图片显示-->
<Image Source="{Binding PreviewImage1}"/>
<Image Grid.Column="1" Source="{Binding PreviewImage2}"/>
<Image Grid.Column="2" Source="{Binding PreviewImage3}"/>
<Image Grid.Row="1" Source="{Binding PreviewImage4}"/>
<Image Grid.Row="1" Grid.Column="1" Source="{Binding PreviewImage5}"/>
<Image Grid.Row="1" Grid.Column="2" Source="{Binding PreviewImage6}"/>
<!--文字标注-->
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="原图"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="中值滤波" Grid.Column="1"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="均值滤波" Grid.Column="2"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="高斯滤波" Grid.Row="1"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="双边滤波" Grid.Row="1" Grid.Column="1"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="15" Foreground="Red" Text="方框滤波" Grid.Row="1" Grid.Column="2"/>
</Grid>
</Window>