【问题标题】:Accessing pixel values from destination image of CopyMakeBorder function in Emgu CV从 Emgu CV 中 CopyMakeBorder 函数的目标图像访问像素值
【发布时间】:2017-12-01 19:28:25
【问题描述】:

这里对 EmguCV 有点新意

只想问个简单的问题,关于CopyMakeBorder函数

目标图像的像素值是否可访问?

我想进一步处理目标图像,但是当我尝试访问图像中的像素值时,它只返回 0(即使在不应该为 0 的位置,例如中心像素)。当我使用 Imshow 时,它显示图像边框得到了完美处理,但问题仅在我尝试访问像素值时仍然存在,无论像素位置在哪里都只会得到 0。

当我尝试使用来自其他 EmguCV 函数(例如 Threshold 函数)的目标图像时,这不是问题

谁能澄清一下?非常感谢!!

我正在使用 VB.net,这是代码(我周末不在我的工作站,所以我只是想记住代码,可能这里有些大写字母打错了,但我希望你明白要点。)

首先我初始化源图像和目标图像

Dim img As Image(Of Gray,Byte) = New Image (Of Gray, Byte)("myimage.jpg")
Dim img1 As Image(Of Gray,Byte) = New Image (Of Gray, Byte)(img.size)

CopyMakeBorder函数,向上、下、左、右扩展1个像素。边框类型常量0值

Cvinvoke.CopyMakeBorder(img,img1,1,1,1,1,BorderType.Constant, New MCvscalar(0))

从目标图像访问像素值,以 x = 100、y = 100 和通道 0 中的像素为例(因为它是灰度图像)

Console.writeline(img1.data(100,100,0))

这将使调试输出为 0,无论我尝试在哪里获取像素值,它仍然是 0,即使当我尝试显示特定像素不应该为 0 的图像时(它不是黑色)

Cvinvoke.Imshow("test",img1)

【问题讨论】:

    标签: vb.net emgucv


    【解决方案1】:

    您正在尝试通过 Image.Data 访问数据,但是,这不包括添加的边框;只是原始位图。

    但是,添加的边框位于 Mat 属性中。通过它可以访问各个像素

    ' returns data from original bitmap
    Console.WriteLine(img1.Data(100, 100, 0))
    ' returns data from modified bitmap
    Console.WriteLine(img1.Mat.GetData(100, 100)(0))
    

    【讨论】:

    • 据我了解,如果我想设置像素值(例如,如果我想遍历像素),我必须将 Mat 转换为 Image(,)。如果我将目标Mat 转换为Image(,),我还能使用Image.Data 吗?
    • to set pixel values (for example if I want to iterate through the pixels) 这些东西不一样。好吧,您可以将 Mat 放入图像中,但它不是同一个对象,而是 Dim img2 = img1.Mat.ToImage(Of Gray, Byte) 的副本,因此您无法以这种方式在 img1 上设置像素。但是,这不是您的问题的一部分;)
    • 嗯好吧,那么我该如何操作目标图像中的像素值呢?据 emgucv 网站报道,从目标图像访问像素的最简单方法是将其转换为 Image(,) 并使用 Image.Data
    • 是的,您可以获取图像并修改像素,然后将生成的图像用作新图像,即将其放在表单上。
    猜你喜欢
    • 2013-12-21
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2012-06-20
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多