///|
let output_dir = "examples/output/"
///|
let asset_path = "examples/assets/document_enhancement_input.png"
///|
fn write_rgb_png(path : String, img : @image.RgbImage) -> Unit {
try! @demoio.write_bytes_to_file(path, @export.encode_rgb_png(img))
}
///|
fn write_gray_png(path : String, img : @image.GrayImage) -> Unit {
try! @demoio.write_bytes_to_file(path, @export.encode_gray_png(img))
}
///|
fn main {
let input = try! @image.rgb_from_png_bytes(
try! @demoio.read_bytes_from_file(asset_path),
)
let gray = try! @ops.grayscale(input)
let boosted = try! @ops.adjust_brightness(gray, 12)
let contrasted = try! @ops.adjust_contrast(boosted, 1.35)
let baseline_thresholded = try! @ops.threshold(contrasted, 150)
let baseline_opened = try! @morphology.open_binary(
baseline_thresholded,
radius=1,
)
let baseline_enhanced = try! @morphology.close_binary(
baseline_opened,
radius=1,
)
let equalized = try! @histogram.equalize_histogram(contrasted)
let denoised = try! @filter.median_blur(contrasted, radius=1)
let adaptive = try! @ops.adaptive_threshold_mean(denoised, 5, 7)
let opened = try! @morphology.open_binary(adaptive, radius=1)
let enhanced = try! @morphology.close_binary(opened, radius=1)
let resized = try! @image.resize_bilinear(
enhanced,
enhanced.width() * 2,
enhanced.height() * 2,
)
let input_name = "document_enhancement_input.png"
let baseline_name = "document_enhancement_output_v1_0.png"
let equalized_name = "document_enhancement_equalized_v2_0.png"
let output_name = "document_enhancement_output.png"
let resized_name = "document_enhancement_resized_v2_0.png"
let report_name = "document_enhancement_report.html"
write_rgb_png(output_dir + input_name, input)
write_gray_png(output_dir + baseline_name, baseline_enhanced)
write_gray_png(output_dir + equalized_name, equalized)
write_gray_png(output_dir + output_name, enhanced)
write_gray_png(output_dir + resized_name, resized)
try! @demoio.write_string_to_file(
output_dir + report_name,
@export.html_report(
"MoonVision Document Enhancement",
[
"v1.0 pipeline: grayscale -> brightness -> contrast -> threshold(150) -> opening -> closing",
"v1.1 pipeline: grayscale -> brightness -> contrast -> median blur(radius=1) -> adaptive threshold mean(block=5, c=7) -> opening -> closing",
"v2.0 additions: histogram equalization preview and bilinear resize output",
"input asset: " + asset_path,
"input size: " +
input.width().to_string() +
"x" +
input.height().to_string(),
"comparison: v1.0 fixed threshold output is preserved alongside the optimized v1.1 output and v2.0 preprocessing outputs",
],
[
@export.report_image("input asset", input_name),
@export.report_image("v1.0 enhanced document", baseline_name),
@export.report_image("v2.0 histogram equalized preview", equalized_name),
@export.report_image("v1.1 enhanced document", output_name),
@export.report_image("v2.0 bilinear resized document", resized_name),
],
),
)
println("document enhancement output: " + output_dir + output_name)
}