【问题标题】:Converting RGB to Gray scale?将RGB转换为灰度?
【发布时间】:2015-07-30 19:57:41
【问题描述】:

我是 Visual Basic 的新手,过去我在 matlab 中做过图像处理。但目前需要 Visual Basic 中的图像处理。好的,我已经能够显示图像并阅读转换为灰度的内容。但是,我的图像是 jpeg 格式,并且在几个灰度转换器教程中,我一直运行到仅 bmp 图像的位图函数,并且我的代码在尝试处理 JPEG 格式时不断产生错误。我如何阅读 jpeg 并执行灰度操作。这是代码。

Public Class Form1
Private Sub showButton_Click(sender As System.Object, e As System.EventArgs) Handles showButton.Click
    ' Show the Open File dialog. If the user clicks OK, load the
    ' picture that the user chose.
    If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
        PictureBox1.Load(OpenFileDialog1.FileName)
    End If
End Sub

Private Sub GrayImageButton_Click(sender As System.Object, e As System.EventArgs) Handles GrayImageButton.Click
 Dim bm As New jpeg(PictureBox1.Image)
    Dim X As Integer
    Dim Y As Integer
    Dim clr As Integer

    For X = 0 To bm.Width - 1
        For Y = 0 To bm.Height - 1
            clr = (CInt(bm.GetPixel(X, Y).R) + _
                   bm.GetPixel(X, Y).G + _
                   bm.GetPixel(X, Y).B) \ 3
            bm.SetPixel(X, Y, Color.FromArgb(clr, clr, clr))
        Next Y
    Next X
    PictureBox1.Image = bm
End Sub

我收到的错误是

错误 1:“WindowsApplication1.jpeg”类型的值无法转换为“System.Drawing.Image”。

当我使用 bmp 图像实现此功能时,它可以完美运行,但不适用于 jpeg。对于此问题的任何帮助,我将不胜感激。谢谢

【问题讨论】:

    标签: vb.net image


    【解决方案1】:

    只是改变:

    Dim bm As New jpeg(PictureBox1.Image)
    

    收件人:

    Dim bm As New Bitmap(PictureBox1.Image)
    

    不过,使用这样的 ColorMatrix 会更快

    Private Sub GrayImageButton_Click(sender As System.Object, e As System.EventArgs) Handles GrayImageButton.Click
        Dim grayscale As New Imaging.ColorMatrix(New Single()() _
            { _
                New Single() {0.299, 0.299, 0.299, 0, 0}, _
                New Single() {0.587, 0.587, 0.587, 0, 0}, _
                New Single() {0.114, 0.114, 0.114, 0, 0}, _
                New Single() {0, 0, 0, 1, 0}, _
                New Single() {0, 0, 0, 0, 1} _
            })
    
        Dim bmp As New Bitmap(PictureBox1.Image)
        Dim imgattr As New Imaging.ImageAttributes()
        imgattr.SetColorMatrix(grayscale)
        Using g As Graphics = Graphics.FromImage(bmp)
            g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), _
                        0, 0, bmp.Width, bmp.Height, _
                        GraphicsUnit.Pixel, imgattr)
        End Using
        PictureBox1.Image = bmp
    End Sub
    

    【讨论】:

      【解决方案2】:

      jpeg 是在哪里定义的?那是您正在使用的 VB.Net 库吗?还是您自己编写了这个对象?

      .Net 有一些内置的 Jpeg 实用程序,您可能想查看一下:

      http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.jpegbitmapdecoder.aspx

      有了这个你应该能够访问像素,从那里你的颜色操作背景应该允许你使用它来做你想做的事情。

      【讨论】:

      • 为了显示位图图像,代码的格式如上所示,但是对于上面代码的第二部分,尺寸为 Dim,我替换了 jpeg 并使用了位图,它适用于 BMP 图像.所以我访问了该站点,据我了解,该页面上的第二个源代码文件转换为 jpeg 以便它在 Visual Basic 中可以接受。谢谢
      【解决方案3】:

      我建议查看像 AForge 或 OpenCV 这样的成像库。它们内置了许多有用的功能(例如,几种不同的 RGB 到灰度算法)。 OpenCV 是用 C++ 编写的,因此它可能比用 VB 编写的任何东西都要快。我不确定 AForge,但我认为它是用 C# 编写的。

      【讨论】:

      • 不幸的是,先生,我不熟悉 C++。这是为学校实验室准备的,实验室负责人只熟悉用于图像处理的 Visual Basic,而不是 matlab。所以我在matlab中有我需要的所有东西,但在VB中没有。作为一名工程专业的我,前段时间只处理过matlab和c。
      • 您不需要了解 C++。您只需导入 OpenCV DLL 并从 VB 中调用它。
      【解决方案4】:

      vb.net 中没有jpeg 这样的类型,所以行:

      Dim bm As New jpeg(PictureBox1.Image) 
      

      应该替换为

      Dim bm as Bitmap = New Bitmap(PictureBox1.image)
      

      【讨论】:

        【解决方案5】:

        这是一个很好的代码

        子黑白() 将 x 调暗为整数 Dim y As Integer 像字节一样暗红 暗绿色作为字节 暗蓝色作为字节 对于 x = 0 到 I.Width - 1 对于 y = 0 到 I.Height - 1 红色 = I.GetPixel(x, y).R 绿色 = I.GetPixel(x, y).G 蓝色 = I.GetPixel(x, y).B I.SetPixel(x, y, Color.FromArgb(blue, blue, blue)) 下一个 下一个 PictureBox1.Image = 我 结束子

        【讨论】:

          猜你喜欢
          • 2020-04-29
          • 2010-10-15
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-23
          • 2014-02-26
          • 2016-10-18
          相关资源
          最近更新 更多