摘要:随着计算机技术的迅速发展,数字图像处理技术在医学领域的研究和应用日益深入和广泛。现代医学已越来越离不开医学图像处理技术。医学图像处理技术在临床诊断、教学科研等方面发挥了重要的作用。计算机图像处理技术与影像技术的结合从根本上改变了医务人员进行诊断的传统方式。充分地利用这些技术可以提高诊断的正确性和准确性,提高诊断效率,降低医疗成本,可以更加充分地发挥各种医疗设备的功能。而且,随着数字化、智能化进程的深人,图像处理技术在医疗卫生领域将会有更加广阔的应用前景。
Java是Sun公司推出的一种面向对象编程语言。Java非常适合于企业网络和Internet环境,现已成为Internet中最受欢迎、最有影响的编程语言之一。目前国内使用Java语言开发的图像处理系统比较少,这也增加了这方面的研究价值。本文首先对图像增强和图像分割中的几种算法进行了介绍,包括线性灰度变换,伪彩色处理,平滑处理,中值滤波,阈值分割,边缘检测等。然后用Java语言对上述各算法编程实现,并设计Java GUI(图形用户界面)用来显示图像处理的结果,以及创建一个数据库用于存储医学图像。
目录:
设计流程:
5.1 主流程图
首先设计Java GUI即Java用户图形界面,对其中的按钮,菜单添加事件监听器,以便能够当用户触发事件做出相应的响应,然后添加了文件选择器以及连接数据库并实现了数据库查询、插入功能,使用户可以从本地磁盘或从数据库中查询图像。将图像显示在GUI后就可以通过相应的按钮对图像进行处理。
5.2 图像处理界面
在这个界面中,无论是按钮还是菜单选项,都添加了监听器用来监听是否有事件发生,并且都有一个相应的事件处理器。当用户单击其中任何一个都会触发相应的事件,然后将事件发送到事件处理器中进行处理。界面的左侧用于显示载入的图像,即原始图像,右侧用于显示处理后图像,以便对处理前后的图像进行对比。详细代码参见附录C。
5.3 图像的加载
本设计可以处理从本地磁盘或从数据库中调出的图像,但有一个共同点就是所采用的加载方式是一样的,都是利用MediaTracker类的对象跟踪图像的加载,看如下代码:MediaTracker tracker = new MediaTracker(this); Image im=Toolkit.getDefaultToolkit( ).getImage(filename);MediaTracker类是一个跟踪多种媒体对象状态的实用工具类。媒体对象可以包括音频剪辑和图像,但目前仅支持图像。要使用媒体跟踪器,需要创建一个MediaTracker实例,然后对每个要跟踪的图像调用其addImage方法。另外,还可以为每个图像分配一个惟一的标识符,此标识符可控制获取图像的优先级顺序。此处将标识符设置为0。Image是表示图形图像的所有类的超类。Toolkit.getDefaultToolkit( ).getImage(filename);返回一幅图像,类型为Image。该图像从指定文件filename中获取像素数据。同时也为调用Image类中的获取图像长和宽的方法创造了条件。接着看下面的代码:int iw=im.getWidth(this); int ih=im.getHeight(this); int[] pixels=new int[iw*ih];以上三段代码是对图像im分别获得其长和宽,然后创建数组,数组的长度为图像长和宽的乘积,即为图像中点的数量。 PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw); }catch (InterruptedException e) {PixelGrabber类实现可以附加在Image或ImageProducer对象上以获得该图像像素子集的ImageConsumer。上述代码首先创建一个PixelGrabber对象,以便从指定的图像im中将像素矩形部分(0,0,iw,ih)抓取到给定的数组pixels中。以默认的RGB ColorModel形式将像素存储到数组中。然后调用grabPixels()方法请求Image开始传递像素,并等待传递完相关矩形中的所有像素。如果成功抓取了像素,则返回true;在中止、有错误或超时的情况下返回false。所以将其放在try语句中,以捕获异常。ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw); Image tmp=createImage(ip);MemoryImageSource类是ImageProducer接口的一个实现,该接口使用一个数组为Image生成像素值。上面语句构造一个使用默认RGB ColorModel中的整数数组为Image对象生成数据的ImageProducer对象,然后createImage使用指定的图像生成器创建一幅图像。repaint( )方法会自动调用paint( ),将图像显示在组件上。(如图5.4所示)public void paint(Graphics g)g.drawImage(tmp,9,171,this);
5.4 图像的处理
本设计中所实现的灰度变换、伪彩色处理、平滑处理、阈值分割及边缘检测所采用的方法是对图像中各像素的R、G、B三个分量做运算。其流程图如图5.5所示。
图5.5 灰度变换、伪彩色处理、平滑处理、阈值分割及边缘检测流程图如果图像已加载,则首先创建一个ColorModel对象,此ColorModel抽象类封装了将像素值转换为颜色分量(例如,红色、绿色和蓝色)和alpha分量的方法。为了将图像呈现到屏幕、打字机或其他图像上,必须将像素值转换为颜色和alpha分量。看如下代码: ColorModel cm=ColorModel.getRGBdefault();int alpha=cm.getAlpha(pixels[i*iw+j]);int red=cm.getRed(pixels[i*iw+j]);int green=cm.getGreen(pixels[i*iw+j]);int blue=cm.getBlue(pixels[i*iw+j]);上面的语句可得到每个像素点的R、G、B及alpha分量的值,然后通过对各点的R、G、B做运算即可实现图像的处理。最后将运算后图像的颜色分量及alpha分量值存入像素数组pixels中,应用MemoryImageSource类中的方法产生图像。例如:下面的代码是实现图像反转灰度变换模块的完整代码。其结果如图5.6所示。public void jfanzhuan_ActionPerformed(ActionEvent e)ColorModel cm=ColorModel.getRGBdefault();for(i=0;i<ih;i++)int alpha=cm.getAlpha(pixels[i*iw+j]);int red=255-cm.getRed(pixels[i*iw+j]);int green=255-cm.getGreen(pixels[i*iw+j]);int blue=255-cm.getBlue(pixels[i*iw+j]);pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue;ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw); JOptionPane.showMessageDialog(null,"请先打开一幅图片!", "提示",JOptionPane.WARNING_MESSAGE);
5.5 数据库的建立
本设计实现了一个医学图像档案,即创建了一个数据库用于存放病人ID,姓名及其图像信息。可以通过病人的ID进行图像信息的查询,还可以将新的图像信息添加进此档案中。其设计流程图如图5.7所示。
本设计所使用的数据库为Access数据库,首先用Access创建了image.mdb,在其中创建了一个名为pic的表用于存放病人ID,姓名及其图像信息。Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con = DriverManager.getConnection("jdbc:odbc:image");stmt = con.createStatement();上述语句首先调用了Class类的forName方法,将返回一个sun.jdbc.odbc.JdbcOdbcDriver类的对象,称为加载JDBC-ODBC Bridge驱动器。然后通过调用DriverManager 类的getConnection方法,连接地址为jdbc:odbc:image的数据库,并且返回一个Connection类型的对象赋予变量con。这样便建立了与数据库image的连接。接着调用Connection类的createStatement方法,创建了一个Statement类的对象stmt,即创建了一个将SQL语句传递给数据库的Statement对象。ResultSet rs = stmt.executeQuery("SELECT ID, 姓名,图片 FROM pic");此句调用Statement对象的executeQuery方法执行SQL语句,将结果返回给一个ResultSet类型的变量rs,通过调用ResultSet类中的方法即可实现数据库的查询。 String s1=JOptionPane.showInputDialog(null,"请输入ID"); String s2 = JOptionPane.showInputDialog(null,"请输入姓名"); String strInc = "INSERT INTO pic(ID,姓名,图片) Values('"+s1+"','"+s2+"','"+filename+"')"; stmt.executeUpdate(strInc);当执行插入操作时,程序首先弹出对话框要求用户输入ID及姓名,然后即可将GUI中的图像保存进数据库。详细代码参见附录C。当用户退出本系统时,除了释放系统资源外还要关闭与数据库操作相关的链接,其代码如下:stmt.close(); //关闭Statement对象