Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。


Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。


Baumer工业相机使用图像算法增加图像的技术背景

工业相机通常使用各种图像算法来提高其捕获的图像的质量。这些算法旨在提高图像的清晰度、对比度、色彩准确性和整体图像质量。


最常用的算法之一是降噪算法。该算法用于消除图像中可能出现的任何随机噪声或颗粒。另一个流行的算法是图像稳定算法。该算法用于减少由相机抖动引起的模糊现象。


另一个用于工业相机的流行图像算法是边缘增强算法。该算法用于提高图像中边缘的清晰度。它通过检测图像中的边缘,然后增加这些边缘的对比度来工作。


直方图均衡化是另一种用于工业相机的图像算法。该算法通过重新分配像素值以覆盖图像中的整个可用值范围来改善图像的对比度。


总的来说,这些图像算法帮助工业相机捕获清晰和高质量的图像。它们在现代成像系统中起着至关重要的作用,在机器人、显微镜和医学成像等领域至关重要。


本文这里只简单使用Baumer工业相机进行伽马增强的图像算法。


Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法

下面介绍在C#里Baumer工业相机在回调函数里直接进行对数Log变换图像增强的演示


对数Log变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。


1.引用合适的类文件

代码如下(示例):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BGAPI2;
using System.Runtime.InteropServices;
using System.IO;
using CSCameraDemo.Properties;
using System.Globalization;
using WindowsFormsApplication1;
using System.Threading.Tasks;
using System.Threading;
using System.Drawing.Imaging;
using OpenCvSharp;
using OpenCvSharp.Dnn;

2.BGAPI SDK在图像回调中引用OpenCV的对数Log变换增强算法

代码如下(示例),C#调用代码如下所示:

void mDataStream_NewBufferEvent(object sender, BGAPI2.Events.NewBufferEventArgs mDSEvent)
{
    try
    {
        BGAPI2.Buffer mBufferFilled = null;              
        mBufferFilled = mDSEvent.BufferObj;
        if (mBufferFilled == null)
        {
            MessageBox.Show("Error: Buffer Timeout after 1000 ms!");
        }
        else if (mBufferFilled.IsIncomplete == true)
        {
            //MessageBox.Show("Error: Image is incomplete!");
            //queue buffer again
            mBufferFilled.QueueBuffer();
        }
        else
        {
            #region//获取当前FrameID
            FrameIDInt = (int)mBufferFilled.FrameID;
            OnNotifySetFrameID(FrameIDInt.ToString());
            #endregion
            //将相机内部图像内存数据转为bitmap数据
            System.Drawing.Bitmap bitmap  = new System.Drawing.Bitmap((int)mBufferFilled.Width, (int)mBufferFilled.Height, (int)mBufferFilled.Width,
                System.Drawing.Imaging.PixelFormat.Format8bppIndexed, (IntPtr)((ulong)mBufferFilled.MemPtr + mBufferFilled.ImageOffset));
            #region//Mono图像数据转换。彩色图像数据转换于此不同
            System.Drawing.Imaging.ColorPalette palette = bitmap.Palette;
            int nColors = 256;
            for (int ix = 0; ix < nColors; ix++)
            {
                uint Alpha = 0xFF;
                uint Intensity = (uint)(ix * 0xFF / (nColors - 1));
                palette.Entries[ix] = System.Drawing.Color.FromArgb((int)Alpha, (int)Intensity, (int)Intensity, (int)Intensity);
            }
            bitmap.Palette = palette;
            #endregion
            #region//回调函数保存图像功能
            if (bSaveImg)
            {
                //使用bitmap自带函数保存
                string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");
                string saveimagepath = pImgFileDir  +"\\"+ strtime + ".jpg";
                bitmap.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp);
                //使用opencv进行保存图像
                if (mBufferFilled.PixelFormat == "Mono8")
                {
                    OpenCvSharp.Mat matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                           
                    matgray.SaveImage("opencv_image.png");
                    Cv2.ImWrite("opencvcv_image_Clone.png", matgray);
                }                      
                bSaveImg = false;//变量控制单次保存图像
            }
            #endregion
            #region//对灰度图像进行对数Log变换算法增强
            OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                 
    //方法一   
    Mat logImage = new Mat();
    Mat Qualized= new Mat();
    // Perform log transformation
    Cv2.Log(Matgray, logImage);
    // Normalize the transformed image
    Cv2.Normalize(logImage, logImage, 0, 255, NormTypes.MinMax);
    // Convert back to 8-bit image
    logImage.ConvertTo(Qualized, MatType.CV_8U);
            Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap
            #endregion
            #region//bitmap的图像数据复制pBitmap
            Bitmap clonebitmap = (Bitmap)bmp.Clone();
            BitmapData data = clonebitmap.LockBits(new Rectangle(0, 0, clonebitmap.Width, clonebitmap.Height), ImageLockMode.ReadOnly, clonebitmap.PixelFormat);
            clonebitmap.UnlockBits(data);
            pBitmap = clonebitmap;
            #endregion
            #region//将pBitmap图像数据显示在UI界面PictureBox控件上
            prcSource.X = 0;prcSource.Y = 0;
            prcSource.Width = (int)mBufferFilled.Width;prcSource.Height = (int)mBufferFilled.Height;
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromHwnd(pictureBoxA.Handle);
            graph.DrawImage(pBitmap, prcPBox, prcSource, GraphicsUnit.Pixel);
            #endregion
            clonebitmap.Dispose(); //清除临时变量clonebitmap所占内存空间
            mBufferFilled.QueueBuffer();
        }
    }
    catch (BGAPI2.Exceptions.IException ex)
    {
        {
            string str2;
            str2 = string.Format("ExceptionType:{0}! ErrorDescription:{1} in function:{2}", ex.GetType(), ex.GetErrorDescription(), ex.GetFunctionName());
            MessageBox.Show(str2);
        }
    }
    return;
}

3.OpenCV进行对数Log变换算法进行图像增强

Cv2.Log方法对灰度图像进行对数转换。

为了确保像素值在0-255的范围内、 使用Cv2.Normalize方法将转换后的图像归一化。

最后,使用ConvertTo方法将归一化的图像转换为8位图像,

并使用Cv2.Normalize方法显示结果。


C#调用代码如下所示:

#region//对灰度图像进行对数Log变换算法增强
OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                            
Mat logImage = new Mat();
Mat Qualized= new Mat();
// Perform log transformation
Cv2.Log(Matgray, logImage);
// Normalize the transformed image
Cv2.Normalize(logImage, logImage, 0, 255, NormTypes.MinMax);
// Convert back to 8-bit image
logImage.ConvertTo(Qualized, MatType.CV_8U);
// Show the result
Cv2.ImShow("Log Transformed Image", logImage);
Cv2.WaitKey(0);
Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap
#endregion

呈现效果如下所示:

(未使用对数Log变换增强图像算法)

4.png


(使用对数Log变换增强图像算法)

3.png


Baumer工业相机使用图像算法增强图像的优势

提高图像质量: 随着图像算法的使用,工业相机可以产生高度详细和清晰的图像。这些算法可以减少噪音,突出边缘,并增加对比度,以产生更好的图像质量。


增加准确性:图像算法也可以提供高度准确的测量和数据。通过使用边缘检测和模式识别等图像分析技术,工业相机可以更精确地识别和测量物体。


成本效益: 通过提高图像质量和准确性,工业相机可以减少对人工检查的需求,从而降低与质量控制和产品拒绝相关的成本。


效率提高: 通过使图像分析过程自动化,工业相机可以提高产量,减少周期时间,使生产线更有效率。


更好的决策: 随着图像质量和准确性的提高,工业相机可以为决策者提供高度详细和可靠的数据,使他们能够对生产过程和质量控制做出更明智的决定。


Baumer工业相机使用图像算法增强图像的行业应用

带有图像算法的工业相机被广泛应用于各个行业,用于增强图像,以提高产品质量、安全和效率。以下是其应用的一些例子:


制造业: 具有图像算法的工业相机用于检查装配线的缺陷,检查产品的质量,并确保遵守安全标准。它们还可用于在制造过程中检查零件,这有助于及早发现缺陷,防止昂贵的生产延误。


汽车行业: 在汽车行业,具有图像算法的工业相机被广泛用于安全检查,检测汽车零部件的缺陷,并确保司机和乘客的安全。它们还可用于事故发生后的损害评估。


航空航天: 工业相机在航空航天工业中用于检查卫星、火箭和其他航天器在组装期间和组装后的部件。图像算法可以帮助检测关键部件的缺陷和故障,以确保宇航员的安全和太空任务的成功。


医疗:具有图像算法的工业相机被用于检测和诊断疾病和医疗状况的医疗应用。它们还被用于医学研究、分析和监测病人的健康。


农业: 工业相机可用于监测作物的生长,检查农产品的质量,并检测作物的病虫害。图像算法可以帮助早期发现问题,使农民能够采取纠正措施来保护他们的作物。


在所有这些行业中,使用带有图像算法的工业相机大大改善了图像分析的效率和准确性,从而提高了产品质量,增加了安全性,并降低了成本。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
95 0
|
3月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
6月前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
6月前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
7月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
267 0
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
219 3
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
39 3
|
7天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
43 12
|
1月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
53 4
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
54 2