1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2018年2月25日 |
---|
#800 在 #input
31KB
591 行
此包提供 Chan-Vese 水平集的实现,由 T. Chan 和 L. Vese 在 Active contours without edges 中描述。它是 Kevin Keraudren 在 Github 上的 Python 实现和 Shawn Lankton 的 Matlab 实现的移植。
示例
要使用模块 chanvese::utils
内部的函数,您需要使用带有 image-utils 特性的此包进行编译。
extern crate image;
extern crate rand;
extern crate chanvese;
use std::f64;
use std::fs::File;
use image::ImageBuffer;
use rand::distributions::{Sample, Range};
use chanvese::{FloatGrid, BoolGrid, chanvese};
use chanvese::utils;
fn main() {
// create an input image (blurred and noisy ellipses)
let img = {
let mut img = ImageBuffer::new(256, 128);
for (x, y, pixel) in img.enumerate_pixels_mut() {
if (x-100)*(x-100)+(y-70)*(y-70) <= 35*35 {
*pixel = image::Luma([200u8]);
}
if (x-128)*(x-128)/2+(y-50)*(y-50) <= 30*30 {
*pixel = image::Luma([150u8]);
}
}
img = image::imageops::blur(&img, 5.);
let mut noiserange = Range::new(0.0f32, 30.);
let mut rng = rand::thread_rng();
for (_, _, pixel) in img.enumerate_pixels_mut() {
*pixel = image::Luma([pixel.data[0] + noiserange.sample(&mut rng) as u8]);
}
let ref mut imgout = File::create("image.png").unwrap();
image::ImageLuma8(img.clone()).save(imgout, image::PNG).unwrap();
let mut result = FloatGrid::new(256, 128);
for (x, y, pixel) in img.enumerate_pixels() {
result.set(x as usize, y as usize, pixel.data[0] as f64);
}
result
};
// create a rough mask
let mask = {
let mut result = BoolGrid::new(img.width(), img.height());
for (x, y, value) in result.iter_mut() {
if (x >= 65 && x <= 180) && (y >= 20 && y <= 100) {
*value = true;
}
}
result
};
utils::save_boolgrid(&mask, "mask.png");
// level-set segmentation by Chan-Vese
let (seg, phi, _) = chanvese(&img, &mask, 500, 1.0, 0);
utils::save_boolgrid(&seg, "out.png");
utils::save_floatgrid(&phi, "phi.png");
}
依赖项
~11–580KB