November 28, 2020, 11:35:08 AM

Author Topic: [bb] Simple Contour by _PJ_ [ 1+ years ago ]  (Read 443 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Simple Contour by _PJ_ [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Simple Contour
Author : _PJ_
Posted : 1+ years ago

Description : 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.


Code :
Code: BlitzBasic
  1. Global Path$=GetEnv("PROGRAMFILES")+"Blitz3Dsamplesirdie       hunderhmap.bmp"
  2.  
  3. Graphics 800,600,32,6
  4. SetBuffer BackBuffer()
  5.  
  6.         Image=LoadImage(Path$)
  7.  
  8.         ccc=ContourMap(Image)
  9.  
  10.         While Not KeyDown(1)
  11.        
  12.         If KeyDown(57)  And (MilliSecs()-lastkey>250)
  13.                 FlushKeys
  14.                 lastkey=MilliSecs()
  15.                 display=Not(display)
  16.         End If
  17.         Cls
  18.         DrawImage (ccc*display)+(Image*(1-display)),0,0
  19.         Color 0,255,0
  20.         Text 0,0,"Press Space to switch image / contour map"
  21.         Flip
  22.         Wend
  23.  
  24. Function ContourMap%(Image%,Tolerance#=0.5)
  25.         If (Not(Image)) Then Return 0
  26.         Local Contour%=CreateImage(ImageWidth(Image),ImageHeight(Image))
  27.        
  28.                 Local X1=0
  29.                 Local Y1=0
  30.                 Local X2=ImageWidth(Image)-1
  31.                 Local Y2=ImageHeight(Image)-1
  32.                
  33.         Buffer=(ImageBuffer(Image))
  34.         CBuffer=(ImageBuffer(Contour))
  35.        
  36.         LockBuffer Buffer
  37.         LockBuffer CBuffer
  38.         For x=X1 To X2
  39.         For y=Y1 To Y2
  40.                 Pixel=ReadPixelFast(x,y,Buffer)
  41.                 If (AdjacentDifference(Pixel,x,y,Image,Tolerance#)) Then WritePixelFast x,y,RGBa(255,255,255),CBuffer
  42.         Next
  43.         Next
  44.         UnlockBuffer ImageBuffer(Image)
  45.         UnlockBuffer ImageBuffer(Contour)
  46.         Return Contour
  47. End Function
  48.                
  49.         Function PixelTopLeft%(Image%,x%,y%)
  50.                 If (Not(Image)) Then Return -1
  51.                 Local X1=1
  52.                 Local Y1=1
  53.                 Local X2=ImageWidth(Image)-2
  54.                 Local Y2=ImageHeight(Image)-2
  55.        
  56.                 If (Not(x>=X1 And y>=Y1)) Then  Return -1
  57.                
  58.                 x=x-1
  59.                 y=y-1
  60.                 Local Buffer%=ImageBuffer(Image)
  61.                 ;LockBuffer Buffer
  62.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  63.                 ;UnlockBuffer Buffer
  64.                 Return nReturn
  65.         End Function   
  66.        
  67.         Function PixelTopMid%(Image,x,y)
  68.                 If (Not(Image)) Then Return -1
  69.                 Local X1=1
  70.                 Local Y1=1
  71.                 Local X2=ImageWidth(Image)-2
  72.                 Local Y2=ImageHeight(Image)-2
  73.        
  74.                 If (Not(y>=Y1)) Then  Return -1
  75.                
  76.                 y=y-1
  77.                 Local Buffer%=ImageBuffer(Image)
  78.                 ;LockBuffer Buffer
  79.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  80.                 ;UnlockBuffer Buffer
  81.                 Return nReturn
  82.         End Function
  83.  
  84.         Function PixelTopRight%(Image,x,y)
  85.                 If (Not(Image)) Then Return -1
  86.                 Local X1=1
  87.                 Local Y1=1
  88.                 Local X2=ImageWidth(Image)-2
  89.                 Local Y2=ImageHeight(Image)-2
  90.        
  91.                 If (Not(x<=X2 And y>=Y1)) Then  Return -1
  92.                
  93.                 x=x+1
  94.                 y=y-1
  95.                 Local Buffer%=ImageBuffer(Image)
  96.                 ;LockBuffer Buffer
  97.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  98.                 ;UnlockBuffer Buffer
  99.                 Return nReturn
  100. End Function
  101.  
  102.         Function PixelMidLeft%(Image,x,y)
  103.                 If (Not(Image)) Then Return -1
  104.                 Local X1=1
  105.                 Local Y1=1
  106.                 Local X2=ImageWidth(Image)-2
  107.                 Local Y2=ImageHeight(Image)-2
  108.                
  109.                 If (Not(x>=X1)) Then  Return -1
  110.                
  111.                 x=x-1
  112.                 Local Buffer%=ImageBuffer(Image)
  113.                 ;LockBuffer Buffer
  114.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  115.                 ;UnlockBuffer Buffer
  116.                 Return nReturn
  117.         End Function   
  118.        
  119.         Function PixelMidRight%(Image,x,y)
  120.                 If (Not(Image)) Then Return -1
  121.                 Local X1=1
  122.                 Local Y1=1
  123.                 Local X2=ImageWidth(Image)-2
  124.                 Local Y2=ImageHeight(Image)-2
  125.        
  126.                 If (Not(x<=X2)) Then  Return -1
  127.                
  128.                 x=x+1
  129.                 Local Buffer%=ImageBuffer(Image)
  130.                 ;LockBuffer Buffer
  131.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  132.                 ;UnlockBuffer Buffer
  133.                 Return nReturn
  134. End Function
  135.  
  136.         Function PixelBotLeft%(Image,x,y)
  137.                 If (Not(Image)) Then Return -1
  138.                 Local X1=1
  139.                 Local Y1=1
  140.                 Local X2=ImageWidth(Image)-2
  141.                 Local Y2=ImageHeight(Image)-2
  142.        
  143.                 If (Not(x>=X1 And y<=Y2)) Then  Return -1
  144.                
  145.                 x=x-1
  146.                 y=y+1
  147.                 Local Buffer%=ImageBuffer(Image)
  148.                 ;LockBuffer Buffer
  149.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  150.                 ;UnlockBuffer Buffer
  151.                 Return nReturn
  152. End Function
  153.  
  154.         Function PixelBotMid%(Image,x,y)
  155.                 If (Not(Image)) Then Return -1
  156.                 Local X1=1
  157.                 Local Y1=1
  158.                 Local X2=ImageWidth(Image)-2
  159.                 Local Y2=ImageHeight(Image)-2
  160.        
  161.                 If (Not(y<=Y2)) Then  Return -1
  162.                
  163.                 y=y+1
  164.                
  165.                 Local Buffer%=ImageBuffer(Image)
  166.                 ;LockBuffer Buffer
  167.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  168.                 ;UnlockBuffer Buffer
  169.                 Return nReturn
  170.         End Function
  171.                
  172.         Function PixelBotRight%(Image,x,y)
  173.                 If (Not(Image)) Then Return -1
  174.                 Local X1=1
  175.                 Local Y1=1
  176.                 Local X2=ImageWidth(Image)-2
  177.                 Local Y2=ImageHeight(Image)-2
  178.        
  179.                 If (Not(x<=X2 And y<=Y2)) Then  Return -1
  180.                
  181.                 x=x+1
  182.                 y=y+1
  183.                
  184.                 Local Buffer%=ImageBuffer(Image)
  185.                 ;LockBuffer Buffer
  186.                 Local nReturn%=ReadPixelFast(x,y,Buffer)
  187.                 ;UnlockBuffer Buffer
  188.                 Return nReturn
  189.                
  190. End Function   
  191.  
  192. Function AdjacentDifference%(Test_aRGB%,x%,y%,Image%,Tolerance#)
  193.         Local Mean_aRGB%=DeSaturatePixel(Test_aRGB%)
  194.         Local Valid%=False
  195.  
  196.         Local Adjacent%
  197.        
  198.         Adjacent%=DeSaturatePixel(PixelTopLeft(Image,x,y))
  199.         Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  200.         If (Adjacent=-1) Then Valid=False
  201.        
  202.         If (Valid) Return True
  203.                 Adjacent%=DeSaturatePixel%(PixelTopMid(Image,x,y))
  204.                 Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  205.                 If (Adjacent=-1) Then Valid=False
  206.  
  207.         If (Valid) Return True
  208.                 Adjacent%=DeSaturatePixel%(PixelTopRight(Image,x,y))
  209.         Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  210.                 If (Adjacent=-1) Then Valid=False
  211.  
  212.         If (Valid) Return True
  213.                 Adjacent%=DeSaturatePixel%(PixelMidLeft(Image,x,y))
  214.         Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  215.                 If (Adjacent=-1) Then Valid=False
  216.  
  217.         If (Valid) Return True
  218.         Adjacent%=DeSaturatePixel%(PixelMidRight(Image,x,y))
  219.         Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  220.                 If (Adjacent=-1) Then Valid=False
  221.  
  222.         If (Valid) Return True
  223.                 Adjacent%=DeSaturatePixel%(PixelBotLeft(Image,x,y))
  224.                 Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  225.                 If (Adjacent=-1) Then Valid=False
  226.  
  227.         If (Valid) Return True
  228.         Adjacent%=DeSaturatePixel%(PixelBotMid(Image,x,y))
  229.         Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  230.                 If (Adjacent=-1) Then Valid=False
  231.        
  232.         If (Valid) Return True
  233.                 Adjacent%=DeSaturatePixel%(PixelBotRight(Image,x,y))
  234.                 Valid=(Float(Float(Red(Test_aRGB))/Float(Red(Adjacent)))<Tolerance#)
  235.                 If (Adjacent=-1) Then Valid=False
  236.  
  237.         Return Valid
  238.  
  239. End Function
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263. Function RGBa%(R%,G%,B%,a%=0)
  264.         ;       Returns aRGB Value from components.
  265.        
  266.         Return ((a% Shl 24) Or (R% Shl 16) Or (G% Shl 8) Or B%)
  267. End Function
  268.  
  269. ;_______________________________________________________________________________________________________________________
  270. ;_______________________________________________________________________________________________________________________
  271.  
  272. Function Red(RGBa_Value%)
  273.         ;       Returns Red component.
  274.        
  275.         Return (RGBa_Value% Shr 16 And 255)
  276. End Function
  277.  
  278. ;_______________________________________________________________________________________________________________________
  279. ;_______________________________________________________________________________________________________________________
  280.  
  281. Function Green(RGBa_Value%)
  282.         ;       Returns Green component.
  283.        
  284.         Return (RGBa_Value% Shr 8 And 255)
  285. End Function
  286.  
  287. ;_______________________________________________________________________________________________________________________
  288. ;_______________________________________________________________________________________________________________________
  289.  
  290. Function Blue(RGBa_Value%)
  291.         ;       Returns Blue component.
  292.        
  293.         Return (RGBa_Value% And 255)
  294. End Function
  295.  
  296. ;_______________________________________________________________________________________________________________________
  297. ;_______________________________________________________________________________________________________________________
  298.  
  299. Function Alpha%(RGBa_Value%)
  300.         ;       Returns Alpha component.
  301.        
  302.         Return (RGBa_Value% Shr 24 And 255)
  303. End Function
  304.  
  305. ;_______________________________________________________________________________________________________________________
  306. ;_______________________________________________________________________________________________________________________
  307. Function DeSaturatePixel(Colour%)
  308.         ;       Returns the DeSaturated (Mean intensity) RGBa value of a particular pixel
  309.         a%=Alpha%(Colour%)
  310.         R%=Red%(Colour%)
  311.         G%=Green%(Colour%)
  312.         B%=Blue%(Colour%)
  313.         Colour%=((R%-(R%*0.333)*0.5)+(G%-(G%*0.333)*0.5)+(B%-(B%*0.333)*0.5))
  314.         Return RGBa%(Colour%,Colour%,Colour%,a%)
  315. End Function


Comments :


_PJ_(Posted 1+ years ago)

 Deprecated.Now obsolete due to the ContourImage function here:<a href="codearcs382c.html?code=2847" target="_blank">http://blitzbasic.com/codearcs/codearcs.php?code=2847[/url]


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal