首页 > 其他分享 >使用 Nim 实现简单的图像边缘检测

使用 Nim 实现简单的图像边缘检测

时间:2024-12-09 11:43:26浏览次数:3  
标签:.. Nim 检测 image height let result 图像

Nim 是一种高效、表现力丰富的编程语言,支持多种编程范式,尤其在性能和开发效率上表现优异。利用 Nim 的丰富库支持和高效编译特性,可以轻松处理图像相关的任务。下面,我们将使用 Nim 实现一个简单的图像边缘检测程序。

实现代码
以下代码使用 Sobel 算子来检测灰度图像的边缘:

nim更多内容访问ttocr.com或联系1436423940

import pixie, math

加载灰度图像

let inputImage = loadImage("input_image.jpg")

定义 Sobel 滤波器

let sobelX = @[
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
]

let sobelY = @[
[-1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]
]

应用卷积操作

proc applySobel(image: Image, kernel: seq[seq[int]]): Image =
let (width, height) = (image.width, image.height)
var result = newImage(width, height)
for y in 1..<height-1:
for x in 1..<width-1:
var sum = 0
for ky in -1..1:
for kx in -1..1:
let pixel = image.getPixel(x + kx, y + ky).r # 只取灰度值
sum += pixel * kernel[ky + 1][kx + 1]
result.setPixel(x, y, rgba(clamp(sum, 0, 255).byte, 0, 0, 255))
result

let gradX = applySobel(inputImage, sobelX)
let gradY = applySobel(inputImage, sobelY)

计算梯度强度

proc calculateGradient(imageX, imageY: Image): Image =
let (width, height) = (imageX.width, imageX.height)
var result = newImage(width, height)
for y in 0..<height:
for x in 0..<width:
let gx = imageX.getPixel(x, y).r.float
let gy = imageY.getPixel(x, y).r.float
let gradient = clamp(int(sqrt(gxgx + gygy)), 0, 255)
result.setPixel(x, y, rgba(gradient.byte, gradient.byte, gradient.byte, 255))
result

let gradientImage = calculateGradient(gradX, gradY)

保存结果图像

gradientImage.save("output_image.jpg")
步骤解析
图像读取:通过 pixie 库的 loadImage 函数加载输入图像。
定义 Sobel 算子:水平和垂直方向的 Sobel 滤波器分别检测图像的横向和纵向梯度。
卷积操作:利用自定义的 applySobel 函数,对图像应用 Sobel 算子,计算 X 和 Y 方向的梯度。
梯度强度计算:通过计算两个方向梯度的平方和的平方根,生成梯度强度图。
结果保存:使用 save 函数将处理后的图像保存为输出文件。
示例结果
输入图像为一张灰度图片,经过程序处理后,会生成一张包含清晰边缘的图像文件 output_image.jpg,在视觉上更容易捕捉图像的轮廓和边缘细节。

标签:..,Nim,检测,image,height,let,result,图像
From: https://www.cnblogs.com/ocr12/p/18594552

相关文章

  • 使用 Clojure 实现简单的图像边缘检测
    Clojure是一门函数式编程语言,运行于JVM平台,适合处理复杂数据和并发任务。在图像处理领域,Clojure的丰富库支持和简洁的语法能够有效实现基本图像处理任务。本文将使用Clojure实现基于Sobel算子的简单边缘检测。实现代码以下代码使用clojure.java.io和clojure.core.mat......
  • 使用 Crystal 语言实现图像反转处理
    什么是Crystal语言?Crystal是一种静态类型的编程语言,它的设计目标是提供高性能和良好的可读性。Crystal语言在语法上非常接近Ruby,但它通过编译生成高效的机器代码。Crystal的类型系统在编译时进行检查,这使得它在运行时提供接近C语言的性能,同时保持类似Ruby的简洁性。Cr......
  • 机器视觉 | 助力巴西工业生产线的自动化检测和智能控制
    随着人工智能和机器学习技术的快速发展,机器视觉作为其中的重要组成部分,在工业领域得到了广泛的应用。机器视觉技术通过数据采集、计算机图像处理和分析、AI深度学习等方式,可实现对物体信息的提取、处理并加以理解,在现代化工厂产线中,可对产品的外观质量、尺寸、形状等参数进行快......
  • 人脸识别- API人脸检测
    接口描述用于检测输入图像中的人脸,输出人脸位置坐标。请求方法POST接口要求图片大小限制:图片单张大小小于2MB;图片格式限制:图片格式支持jpg/jpeg/png/bmp格式。URI/v1/aiop/api/2f6hqix09mv4/face/PERSON/person/detectFaceFromBase64请求参数1.请求头header参数参数......
  • 使用 Io 语言实现简单的图像处理
    什么是Io语言?Io是一种轻量级、面向对象且动态的编程语言,设计灵感来源于Smalltalk、Lisp和Lua。它以其简洁的语法和强大的元编程能力著称,非常适合快速实现概念验证或进行脚本编写。在本篇文章中,我们将使用Io编写一个简单的灰度图像反转(取反)处理程序。代码实现:灰度图像反......
  • 使用 Crystal 语言实现基本图像处理
    什么是Crystal语言?Crystal是一种静态类型、编译型的编程语言,兼具高性能和简洁的语法。它的语法类似Ruby,但比Ruby更加高效,适合用于性能要求较高的应用程序。Crystal的设计目标之一是提供尽可能少的开销,以确保程序的快速执行。在本篇文章中,我们将使用Crystal编写一个简单......
  • 医学图像处理领域的37个公开数据集|个人观点·24-12-04
    小罗碎碎念上个月分享过影像组学和病理组学领域的公开数据集,不过那批数据是从已发表的文献中提取的。这两天我在查文献的时候,发现了另外一种查找公开数据集的方式——直接搜索标题中含有“dataset”的文献。首先采用上面提到的方法进行文献检索,然后经过筛选,最终挑出了3......
  • AutoConsis:UI内容一致性智能检测15
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • tesseract 识别文字,处理图像二值化,腐蚀膨胀
    fromPILimportImageimportpytesseractimportpytesseractpytesseract.pytesseract.tesseract_cmd=r'C:\ProgramFiles\Tesseract-OCR\tesseract.exe'importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimportpytesseract#如果......
  • AutoConsis:UI内容一致性智能检测4
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......