Ruby 应用于医药领域 Ruby 应用于医药领域:处理医学图片 急救的长阴影图标,矢量版 作为医疗影像图片分析的研究员,我知道这些图片的重要性。图片所揭示的身体信息,不管是内部的(例如MRI)还是外部的(例如皮血管检查),都是极其有价值的。有时候图片上能清晰的看到一个肿瘤,这让我很惊讶。有时候图片还需要一些处理,不过最终这些医学图片都会成为医疗信息的有价值来源。 |
显然,肿瘤并非唯一的通过医学图片能看到的东西。其他问题,例如骨折,也可以通过图片来诊断。医学图片分析已经成为医学很重要的部分,每年都会有很多会议和杂志与此相关。 在这个系列里,我关注的是如何把 Ruby 编程应用到医学领域。这篇文章要介绍的是如何用 Ruby 来显示和处理一个医学图片。 下面我们就开始。 |
软件
|
ImageMagick
|
安装 Tk
|
安装 RMagick
|
1
|
$ gem install rmagick |
显示一个医学图片
我们可使用 Ruby 将图片做出以下的视图效果:
接着,把这个图片以 brain.jpg 格式保存在硬盘上。
首先要做的是读取这个图片。可以使用 TkPhotoImage 类来读取图片:
1
2
3
|
require 'tk' img = TkPhotoImage. new img.file = 'brain.jpg' |
Tk 中组件是有层级关系的,也就是说一个组件可以包含在另一个组件里。在 Tk 中主组件是 rootwidget,且可以用TkRoot 类来创建该组件。可以把 TkRoot 看做主窗口。可用 Ruby 按以下操作来创建主窗口:
1
|
root = TkRoot. new (title 'view image' ) |
创建好主窗口之后,我们需要一个组件来显示图片。我们可以用 TkLabel,它可以让我们创建一个label 来显示我们的图片。可按下面的代码在 root 中创建一个 label: label = TkLabel.new(root)
接下来在 label 里显示图片: label.image = img
在进一步添加 Tk 的控制代码之前,我们需要指定 label 的宽度和高度。我们让 label 的宽度和高度与图片保持一致。代码实现如下所示: label.place(height: img.height, width: img.width)
到此 label 的创建基本上就完成了。为了让 Tk 显示这个组件,我们还需要调用 Tk.mainloop。最后的脚本是这样的: require 'tk'
img = TkPhotoImage.new
img.file = 'brain.jpg'
root = TkRoot.new {title 'view image'}
label = TkLabel.new(root)
label.image = img
label.place(height: img.height, width: img.width)
Tk.mainloop
|
问题与陷阱
|
无法加载文件 — tk (LoadError)
|
1
2
|
cannot load such file -- tk (LoadError) 通常你用 RVM 时会报这个错。对于我们的程序,这个问题可以这样解决:首先确定Tcl已经安装(参考前面安装Tk的部分),然后在终端运行下面的命令(这会把Tk升级到 2 . 2 . 3 ,在Mac OS X 下这个版本的Ruby可以支持Tk): |
1
|
rvm reinstall 2 . 2 . 3 --enable-shared --enable-pthread --with-tk --with-tcl |
无法加载文件 — RMagick (LoadError)
这是 require 'RMagick' 这一行可能报的错误:
1
|
cannot load such file -- RMagick (LoadError) |
要解决这个问题,只需要运行:
1
|
$ gem install rmagick |
解决完这些问题后,程序的输出就像下面这样(刚开始窗口会比较小,可以将其放大成下面这样):
Ruby 应用于医学:Base 64 编码与解码
|
Base64 编码
|
Base64解码
|
1
|
require base64 |
要对图片进行编码,只需要调用函数encode64(bin)。Ruby的文档中对这个函数的说明:
>> 返回参数binBase64编码后的结果。这个方法遵循RFC 2045。每60个编码后的字符会添加一个回车。
下面是对图片进行Base64编码的代码:
1
2
3
4
|
require 'base64' #open the image file and treat it as a binary file image = File .open( 'brain.jpg' ).binmode image_read = image.read image_64_encode = Base64.encode64(image_read) |
如果你想查看编码后的结果,可以加上这一行:
1
|
puts image_64_encode |
图像解码对于使用 ruby 的图像解码来说,可以简单地使用 decode64(str) 函数。该函数的 ruby 文档: 让我们把 Base64 编码与解码的 ruby 脚本图片放在一起。Ruby 脚本,它看起来就像以下的: >>返回 Base64 解码 str 版本。该方法可以通过 RFC 2045 来编译。可以忽视基本字母表以外的字符。 在前面的小节中,你可以对图像编码进行解码,执行以下操作: Base64.decode64(image_64_encode)
完全地放入让我们把 Base64 编码与解码的 ruby 脚本图像放在一起。Ruby 脚本 -----它看起来就像以下的: require 'base64'image = File.open('brain.jpg').binmode
image_read = image.read
image_64_encode = Base64.encode64(image_read)image_64_decode = Base64.decode64(image_64_encode)#create a writable image and write the decoding resultimage_result = File.open('brain_decode.jpg', 'w')image_result.write(image_64_decode)
打开 brain_decode.jpg 图片,你们要注意我们在第一阶段编码的原始图片 brain.jpg 。 |
作者的其他文章
|
本文转自:开源中国社区 [http://www.oschina.net]
本文标题:Ruby 应用于医学领域:处理医学图片
本文地址:http://www.oschina.net/translate/ruby-on-medicine-working-with-medical-images
参与翻译:zicode, 无若, crossmix
英文原文:Ruby on Medicine: Working with Medical Images