Vb.net visualbasic中的滞后阈值处理

Vb.net visualbasic中的滞后阈值处理,vb.net,image-processing,edge-detection,Vb.net,Image Processing,Edge Detection,我试图在VisualBasic中制作一个滞后阈值,用于canny边缘检测。由于我对这个主题和vb都是新手(我主要使用php),我阅读的许多参考资料都指出我需要这样做。由于图像已经是黑白的,我只得到1种颜色的强度。我已经在几秒钟内完成了高斯模糊、灰度、索贝尔遮罩和非最大值抑制。但是在滞后上,执行函数的时间太长了。我不知道我哪里做错了。如果有帮助,图像显示在640 x 480上。我试着把分辨率改小一点,它确实更快,但我想把分辨率保持在640x480。我已经更改了代码,这是我的最终方法 Dim b

我试图在VisualBasic中制作一个滞后阈值,用于canny边缘检测。由于我对这个主题和vb都是新手(我主要使用php),我阅读的许多参考资料都指出我需要这样做。由于图像已经是黑白的,我只得到1种颜色的强度。我已经在几秒钟内完成了高斯模糊、灰度、索贝尔遮罩和非最大值抑制。但是在滞后上,执行函数的时间太长了。我不知道我哪里做错了。如果有帮助,图像显示在640 x 480上。我试着把分辨率改小一点,它确实更快,但我想把分辨率保持在640x480。我已经更改了代码,这是我的最终方法

  Dim bmp_thres As New Bitmap(pic_nonmaxima)


    Dim visited_maps As New List(Of String)

    Dim threshold_H As Integer = 100
    Dim threshold_L As Integer = 50
    Dim Ycount As Integer
    For Ycount = 1 To bmp_thres.Height - 2
        Dim Xcount As Integer
        For Xcount = 1 To bmp_thres.Width - 2


            'check current pointer 
            Dim currPointer As String = Xcount & "," & Ycount
            'find if coordinate visited already
            Dim find_array As String
            If visited_maps IsNot Nothing Then
                find_array = visited_maps.Contains(currPointer)
            Else
                find_array = "False"
            End If

            If find_array Then
                'if existed, do nothing
            Else
                'if not, do something
                Dim currThreshold As Integer
                Dim currColor As Color
                currColor = bmp_thres.GetPixel(Xcount, Ycount)
                currThreshold = currColor.R


                'add coordinate into visited maps
                Dim visited As String = Xcount & "" & Ycount
                visited_maps.Add(visited)

                If currThreshold > threshold_H Then
                    bmp_thres.SetPixel(Xcount, Ycount, Color.FromArgb(255, 255, 255))
                Else
                    bmp_thres.SetPixel(Xcount, Ycount, Color.FromArgb(0, 0, 0))
                    'check connectedness

                    Dim coord_N As String = Xcount & "," & Ycount + 1
                    Dim coord_E As String = Xcount + 1 & "," & Ycount
                    Dim coord_S As String = Xcount & "," & Ycount - 1
                    Dim coord_W As String = Xcount - 1 & "," & Ycount

                    Dim coord_NE As String = Xcount + 1 & "," & Ycount + 1
                    Dim coord_SE As String = Xcount + 1 & "," & Ycount - 1
                    Dim coord_SW As String = Xcount - 1 & "," & Ycount - 1
                    Dim coord_NW As String = Xcount - 1 & "," & Ycount + 1

                    Dim myCoord As New List(Of String)

                    myCoord.Add(coord_N)
                    myCoord.Add(coord_E)
                    myCoord.Add(coord_S)
                    myCoord.Add(coord_W)

                    myCoord.Add(coord_NE)
                    myCoord.Add(coord_SE)
                    myCoord.Add(coord_SW)
                    myCoord.Add(coord_NW)


                    For Each coord In myCoord
                        If Not visited_maps.Contains(coord) Then
                            'Split by ,
                            Dim split_Coord() As String = Split(coord, ",")
                            'check thres on coord
                            Dim coordColor As Color = bmp_thres.GetPixel(split_Coord(0), split_Coord(1))
                            Dim coordThres As Integer = coordColor.R

                            If coordThres > threshold_H Then
                                bmp_thres.SetPixel(split_Coord(0), split_Coord(1), Color.FromArgb(255, 255, 255))
                            Else
                                bmp_thres.SetPixel(split_Coord(0), split_Coord(1), Color.FromArgb(0, 0, 0))
                            End If

                        End If

                        visited_maps.Add(coord)
                    Next 'end if foreach

                End If ' end if checking current threshold
            End If 'end if find coord in visited maps

        Next 'end for xcount
    Next 'end for ycount

    Return bmp_thres
或者如果你发现了我做的一些错误代码,请向我指出

如果我做对了,当我们做滞后阈值时,我们首先检查坐标,如果它已经被访问过,如果它被访问过,我们检查下一个坐标。如果不是,我们将坐标添加到访问的贴图中,如果当前坐标大于阈值高,我们将像素值更改为白色或黑色。然后我们检查连通性,如果它们通过低阈值,我们将像素值更改为白色或黑色。然后我们将所有连通性添加到访问的地图中。重复一遍


我能做些什么来减少时间?或者请指出我的错误。任何帮助都将不胜感激。对不起,如果你不懂英语。这将有助于我的最后一年项目T_T

我认为这可能是在主题上,因为它正在发挥作用(尽管缓慢)。但为了以防万一,我把这个作为部分答案留在这里

坐标搜索中有一个小错误。无论它是否已经在“已访问的地图”中,您仍然会将其添加到列表中,这将在列表中产生大量额外结果

If Not visited_maps.Contains(coord) Then
    ' YOUR CODE
End If

visited_maps.Add(coord)
此行:
已访问的地图。添加(coord)
需要在
If
中,这样您就不会有重复值将列表扩展到需要的范围之外。一个640*480像素的图像将在你的列表中创建超过300000个条目,而有了这个坐标错误,它将有更多的条目


List
可能也不是最合适的类型,像
HashSet
这样的类型更好,因为您不需要通过索引进行访问。看看


每次调用
Color.FromArgb(255,255,255)
时,您都在创建一个新的
Color
对象。这将是至少300000个对象,当您可以在顶部声明一个黑色实例和另一个白色实例,然后根据需要使用它们时


我不确定在逗号分隔的字符串上使用
结构会有什么性能差异,但它会节省大量的拆分/连接,并且更易于阅读

Dim currPointer As String=Xcount&“,”&Ycount

Dim-coord\N作为字符串=Xcount&“,”&Ycount+1

将成为

Dim currPointer As Point=新点(Xcount,Ycount)

Dim coord\N as Point=新点(currPointer.X,currPointer.Y+1)



还有更多的错误,但它们都是相当小的,所以我现在就不讨论它们了

我认为这可能是关于主题的,因为它正在发挥作用(尽管速度很慢)。但为了以防万一,我把这个作为部分答案留在这里

坐标搜索中有一个小错误。无论它是否已经在“已访问的地图”中,您仍然会将其添加到列表中,这将在列表中产生大量额外结果

If Not visited_maps.Contains(coord) Then
    ' YOUR CODE
End If

visited_maps.Add(coord)
此行:
已访问的地图。添加(coord)
需要在
If
中,这样您就不会有重复值将列表扩展到需要的范围之外。一个640*480像素的图像将在你的列表中创建超过300000个条目,而有了这个坐标错误,它将有更多的条目


List
可能也不是最合适的类型,像
HashSet
这样的类型更好,因为您不需要通过索引进行访问。看看


每次调用
Color.FromArgb(255,255,255)
时,您都在创建一个新的
Color
对象。这将是至少300000个对象,当您可以在顶部声明一个黑色实例和另一个白色实例,然后根据需要使用它们时


我不确定在逗号分隔的字符串上使用
结构会有什么性能差异,但它会节省大量的拆分/连接,并且更易于阅读

Dim currPointer As String=Xcount&“,”&Ycount

Dim-coord\N作为字符串=Xcount&“,”&Ycount+1

将成为

Dim currPointer As Point=新点(Xcount,Ycount)

Dim coord\N as Point=新点(currPointer.X,currPointer.Y+1)



还有更多的错误,但它们都很小,所以我暂时不讨论它们

谢谢,我将已访问的_贴图移到了if块中,并创建了黑白的实例。在做这件事的时候,我发现了一些拼写错误,并对它们进行了修正。点结构是否与在字符串中添加逗号并拆分相同?你喜欢叫它split_-coord(0)还是split_-coord(1)?在此之后,我们将查看哈希集。由于您的帮助,时间缩短了,但我认为时间太长了,因为其他人只花了几秒钟,而这几乎需要4分钟。这正常吗?
split\u-coord(0)
会变成
coord.X
,我想是1->Ythanks。hashset和point结构工作正常。现在只需38秒就可以完成所有操作。从高斯到滞后。你让我免于头痛:)谢谢,我将访问的_贴图移到了if块中,并创建了黑白的实例。在做这件事的时候,我发现了一些拼写错误,并对它们进行了修正。点结构是否与在字符串中添加逗号并拆分相同?喜欢打电话给我吗