Code archives/Graphics/Simple Contour

This code has been declared by its author to be Public Domain code.

Download source code

Simple Contour by _PJ_2010
Relies on the mean RGB values of surrounding pixels to determine if a contour is to be drawn.

Has a tolerance parameter which determines baseline ratio for difference of mean RGB values.
Suprisingly fast, but possibly not ideal for realtime application.
Global Path$=GetEnv("PROGRAMFILES")+"\Blitz3D\samples\birdie\thunder\hmap.bmp"

Graphics 800,600,32,6
SetBuffer BackBuffer()

	Image=LoadImage(Path$)

	ccc=ContourMap(Image)

	While Not KeyDown(1)
	
	If KeyDown(57)  And (MilliSecs()-lastkey>250)
		FlushKeys
		lastkey=MilliSecs()
		display=Not(display)
	End If
	Cls
	DrawImage (ccc*display)+(Image*(1-display)),0,0
	Color 0,255,0
	Text 0,0,"Press Space to switch image / contour map"
	Flip
	Wend

Function ContourMap%(Image%,Tolerance#=0.5)
	If (Not(Image)) Then Return 0
	Local Contour%=CreateImage(ImageWidth(Image),ImageHeight(Image))
	
		Local X1=0
		Local Y1=0
		Local X2=ImageWidth(Image)-1
		Local Y2=ImageHeight(Image)-1
		
	Buffer=(ImageBuffer(Image))
	CBuffer=(ImageBuffer(Contour))
	
	LockBuffer Buffer
	LockBuffer CBuffer
	For x=X1 To X2
	For y=Y1 To Y2
		Pixel=ReadPixelFast(x,y,Buffer)
		If (AdjacentDifference(Pixel,x,y,Image,Tolerance#)) Then WritePixelFast x,y,RGBa(255,255,255),CBuffer
	Next
	Next
	UnlockBuffer ImageBuffer(Image)
	UnlockBuffer ImageBuffer(Contour)
	Return Contour
End Function
		
	Function PixelTopLeft%(Image%,x%,y%)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(x>=X1 And y>=Y1)) Then  Return -1
		
		x=x-1
		y=y-1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
	End Function	
	
	Function PixelTopMid%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(y>=Y1)) Then  Return -1
		
		y=y-1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
	End Function

	Function PixelTopRight%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(x<=X2 And y>=Y1)) Then  Return -1
		
		x=x+1
		y=y-1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
End Function

	Function PixelMidLeft%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
		
		If (Not(x>=X1)) Then  Return -1
		
		x=x-1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
	End Function	
	
	Function PixelMidRight%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(x<=X2)) Then  Return -1
		
		x=x+1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
End Function

	Function PixelBotLeft%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(x>=X1 And y<=Y2)) Then  Return -1
		
		x=x-1
		y=y+1
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
End Function

	Function PixelBotMid%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(y<=Y2)) Then  Return -1
		
		y=y+1
		
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
	End Function
		
	Function PixelBotRight%(Image,x,y)
		If (Not(Image)) Then Return -1
		Local X1=1
		Local Y1=1
		Local X2=ImageWidth(Image)-2
		Local Y2=ImageHeight(Image)-2
	
		If (Not(x<=X2 And y<=Y2)) Then  Return -1
		
		x=x+1
		y=y+1
		
		Local Buffer%=ImageBuffer(Image)
		;LockBuffer Buffer
		Local nReturn%=ReadPixelFast(x,y,Buffer)
		;UnlockBuffer Buffer
		Return nReturn
		
End Function	

Function AdjacentDifference%(Test_aRGB%,x%,y%,Image%,Tolerance#)
	Local Mean_aRGB%=DeSaturatePixel(Test_aRGB%)
	Local Valid%=False

	Local Adjacent%
	
	Adjacent%=DeSaturatePixel(PixelTopLeft(Image,x,y))
	Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
	If (Adjacent=-1) Then Valid=False
	
	If (Valid) Return True
		Adjacent%=DeSaturatePixel%(PixelTopMid(Image,x,y))
		Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	If (Valid) Return True
		Adjacent%=DeSaturatePixel%(PixelTopRight(Image,x,y))
	Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	If (Valid) Return True
		Adjacent%=DeSaturatePixel%(PixelMidLeft(Image,x,y))
	Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	If (Valid) Return True
	Adjacent%=DeSaturatePixel%(PixelMidRight(Image,x,y))
	Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	If (Valid) Return True
		Adjacent%=DeSaturatePixel%(PixelBotLeft(Image,x,y))
		Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	If (Valid) Return True
	Adjacent%=DeSaturatePixel%(PixelBotMid(Image,x,y))
	Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False
	
	If (Valid) Return True
		Adjacent%=DeSaturatePixel%(PixelBotRight(Image,x,y))
		Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
		If (Adjacent=-1) Then Valid=False

	Return Valid

End Function























Function RGBa%(R%,G%,B%,a%=0)
	;	Returns aRGB Value from components.
	
	Return ((a% Shl 24) Or (R% Shl 16) Or (G% Shl 8) Or B%)
End Function

;_______________________________________________________________________________________________________________________
;_______________________________________________________________________________________________________________________

Function Red(RGBa_Value%)
	;	Returns Red component.
	
	Return (RGBa_Value% Shr 16 And 255)
End Function

;_______________________________________________________________________________________________________________________
;_______________________________________________________________________________________________________________________

Function Green(RGBa_Value%)
	;	Returns Green component.
	
	Return (RGBa_Value% Shr 8 And 255)
End Function

;_______________________________________________________________________________________________________________________
;_______________________________________________________________________________________________________________________

Function Blue(RGBa_Value%)
	;	Returns Blue component.
	
	Return (RGBa_Value% And 255)
End Function

;_______________________________________________________________________________________________________________________
;_______________________________________________________________________________________________________________________

Function Alpha%(RGBa_Value%)
	;	Returns Alpha component.
	
	Return (RGBa_Value% Shr 24 And 255)
End Function

;_______________________________________________________________________________________________________________________
;_______________________________________________________________________________________________________________________
Function DeSaturatePixel(Colour%)
	;	Returns the DeSaturated (Mean intensity) RGBa value of a particular pixel
	a%=Alpha%(Colour%)
	R%=Red%(Colour%)
	G%=Green%(Colour%)
	B%=Blue%(Colour%)
	Colour%=((R%-(R%*0.333)*0.5)+(G%-(G%*0.333)*0.5)+(B%-(B%*0.333)*0.5))
	Return RGBa%(Colour%,Colour%,Colour%,a%)
End Function

Comments

_PJ_2011
Deprecated.
Now obsolete due to the ContourImage function here:

http://blitzbasic.com/codearcs/codearcs.php?code=2847


Code Archives Forum