粘连字符分割算法的WPF界面
我在Github上分享过一份关于验证码的粘连字符分割的源代码,该代码是基于C#完成的,观察不同验证码图片的分割效果需要修正程序,十分不便。近期将这份源码做成了WPF可视化界面,以方便有兴趣的同学更直观的认识相关算法。
目前该程序的初步界面如下,可自由选取待处理图片,目前仅支持139*40以下的图片,可支持同时观察两个图片中间处理过程。图片中间处理过程包含Sauvola,OTSU,迭代法二值化算法,zhang-suen细化算法,粘连字符分割。
界面做的很粗糙,但是对于一个WPF新手而言,搭出这个界面也困难重重,相关算法在本博客中都有相应的文章专门介绍。本文主要记录WPF界面搭建过程的几个细节和目前遗留的问题点,以备后续查阅,本文所述的源代码地址:https://github.com/livezingy/CaptchaProcess
1. Bitmap转BitmapSource
在WPF界面中,显示原始图像和处理后图像的控件均为image控件。在Image中显示图像需要用到BitmapSource格式的图像,但是二值化算法,细化算法处理之后的图像均为Bitmap格式,因此,我需要将Bitmap图像转换为BitmapSource格式,实现函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Convert Bitmap to BitmapImage public BitmapImage BitmapToBitmapImage(Bitmap bitmap) { Bitmap bitmapSource = new Bitmap(bitmap.Width, bitmap.Height); int i, j; for (i = 0; i < bitmap.Width; i++) for (j = 0; j < bitmap.Height; j++) { System.Drawing.Color pixelColor = bitmap.GetPixel(i, j); System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixelColor.R, pixelColor.G, pixelColor.B); bitmapSource.SetPixel(i, j, newColor); } MemoryStream ms = new MemoryStream(); bitmapSource.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(ms.ToArray()); bitmapImage.EndInit(); return bitmapImage; } |
2. WPF主窗口调用子窗口
Sauvola算法中有两个参数可以调整,WPF界面中设置了一个子窗口可用于调整这两个参数,在主窗口中通过菜单项Setting–>Sauvola Parameter来调用此子窗口,调用方式的实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//子窗口初始化代码 namespace CaptchaProcess { /// <summary> /// SPsetting.xaml 的交互逻辑 /// </summary> public partial class SPsetting : Window { //子窗口初始化 public SPsetting() { InitializeComponent(); } //参数设置完成后将设置值传递给Sauvola函数用变量 private void Button_Click(object sender, RoutedEventArgs e) { MainWindow.m_SauvolaWidth = int.Parse(widthValue.Text); MainWindow.m_SauvolaFactor = float.Parse(factorValue.Text); MainWindow.m_SpWindow.Hide(); } } } //主窗口调用子窗口 public MainWindow() { InitializeComponent(); //主窗口初始化时初始化子窗口 m_SpWindow = new SPsetting(); m_SpWindow.Hide(); } //菜单Setting-->Sauvola Parameter响应处理函数 private void SauvolaP_Click(object sender, RoutedEventArgs e) { m_SpWindow.Show(); } |
3. 当前界面的遗留问题点
当前遗留的问题点与WPF的Combox控件有关:Combox选择与上一次相同的index时,不会触发SelectionChanged事件;加载图像时,无法自动刷新当前选择的中间处理过程。当前遗留问题的原因均是因为我目前暂不知道该如何用代码来触发Combox的SelectionChanged事件,在此记录,后续有解决方案时再记录。
——————–20160914更新———————————————-
经过热心网友的指点,在加载图片完成时调用Combox的SelectionChanged事件处理函数,即可实现加载图像时自动刷新中间处理过程,谢谢大拿的指点!代码已更新至Github。
——————–20160914更新———————————————-