patternMinor
Finding black and white images
Viewed 0 times
whitefindingandimagesblack
Problem
I am looking to speed up the search for black and white images. I have about 150,000 images that I need to check but this is taking so long. How can I speed up the code?
Private Sub BlackOrWhite()
Dim iPath As String = txtFile1.Text
Dim allFiles() As String = IO.Directory.GetFiles(iPath, "*.*", IO.SearchOption.TopDirectoryOnly)
For Each eachPic In allFiles
Dim myImage As Bitmap = New Bitmap(eachPic, True)
Dim myColor As Color = CalculateColorKey(myImage)
myImage.Dispose()
If GetRgbDelta(myColor) = 0 Then
IO.File.Move(eachPic, iPath & "Delete\" & IO.Path.GetFileName(eachPic))
End If
Next
End Sub
Public Shared Function CalculateColorKey(bmp As Bitmap) As Color
Try
Dim keyColor As Color = Color.Empty
Dim highestRgbDelta As Integer = 0
For x As Integer = 0 To CInt((bmp.Width / 2))
For y As Integer = 0 To CInt(bmp.Height / 2)
If GetRgbDelta(bmp.GetPixel(x, y)) <= highestRgbDelta Then
Continue For
End If
highestRgbDelta = GetRgbDelta(bmp.GetPixel(x, y))
keyColor = bmp.GetPixel(x, y)
Next
Next
Return keyColor
Catch ex As Exception
Debug.Print("CalculateColorKey: " & ex.Message)
End Try
End Function
Private Shared Function GetRgbDelta(color As Color) As Integer
GetRgbDelta = 100
Try
Dim aaa As Integer = Math.Abs(CInt(color.R) - CInt(color.G))
Dim bbb As Integer = Math.Abs(CInt(color.G) - CInt(color.B))
Dim ccc As Integer = Math.Abs(CInt(color.B) - CInt(color.R))
Return aaa + bbb + ccc
Catch ex As Exception
Debug.Print("GetRgbDelta: " & ex.Message)
End Try
End FunctionSolution
Your code should have a function
At least this is what I think your program should do, based on your description. You don't need the concept of a "color key" to check whether an image is grayscale or not.
The main point is that the function returns as soon as it has found a colored pixel, since then there is no point in checking the rest of the image.
Note that I don't know Visual Basic well, so there might be syntax errors in the above code. So focus more on the ideas than one the grammar.
IsGrayscale(bmp as Bitmap) as Boolean. It should look like this:Function IsGrayscale(bmp as Bitmap) as Boolean
For x As Integer = 0 To bmp.Width - 1 Do
For y As Integer = 0 To bmp.Height - 1 Do
If Not IsGrayscalePixel(bmp.GetPixel(x, y)) Then
Return False
End If
End For
End For
Return True
End Function
Function IsGrayscalePixel(col as Color) as Boolean
Return col.R = col.G and col.G = col.B
End FunctionAt least this is what I think your program should do, based on your description. You don't need the concept of a "color key" to check whether an image is grayscale or not.
The main point is that the function returns as soon as it has found a colored pixel, since then there is no point in checking the rest of the image.
Note that I don't know Visual Basic well, so there might be syntax errors in the above code. So focus more on the ideas than one the grammar.
Code Snippets
Function IsGrayscale(bmp as Bitmap) as Boolean
For x As Integer = 0 To bmp.Width - 1 Do
For y As Integer = 0 To bmp.Height - 1 Do
If Not IsGrayscalePixel(bmp.GetPixel(x, y)) Then
Return False
End If
End For
End For
Return True
End Function
Function IsGrayscalePixel(col as Color) as Boolean
Return col.R = col.G and col.G = col.B
End FunctionContext
StackExchange Code Review Q#147490, answer score: 2
Revisions (0)
No revisions yet.