Trouble with GrayScale Filter

BlitzPlus Forums/BlitzPlus Programming/Trouble with GrayScale Filter

BHoltzman(Posted 2003) [#1]
I was trying to write a greyscale filter. I thought I was going in the right direction with it, but the program isn't doing what I had expected.

I'm trying to only show luminosity levels on the picture in backbuffer(). Any help would be appreciated.

Thanks,

Ben


BHoltzman(Posted 2003) [#2]
Guess I should post the code too.

Graphics 1024, 768

XOffset = 20
YOffset = 20

ImageFile$ = "C:\Blitz Work\Small Picture 009.jpg"
SetBuffer BackBuffer()

Image = LoadImage(ImageFile)
DrawBlock Image,XOffset,YOffset
LockBuffer BackBuffer()
For XIndex = 1 To ImageWidth(Image)
For YIndex = 1 To ImageHeight(Image)
PixelColor = ReadPixelFast(XIndex,YIndex) And $FFFFFF
Red = PixelColor And $FF0000
Green = PixelColor And $00FF00
Blue = PixelColor And $0000FF
MaxColor = Maximum(Red,Green,Blue)
MaxColor = MaxColor + MaxColor Shl 8 + MaxColor Shl 16
WritePixelFast(XOffset,YOffset,MaxColor,BackBuffer())

Next

If KeyDown(1) Then End

Next
UnlockBuffer BackBuffer()
Flip

Function Maximum(Red,Green,Blue)
If Red > Green And blue
Return red
ElseIf Green > Red And Blue
Return Green
Else
Return Blue
EndIf
End Function

While Not KeyDown(1)

Wend


taxlerendiosk(Posted 2003) [#3]
WritePixelFast(XOffset,YOffset,MaxColor,BackBuffer())
Red = (PixelColor And $FF0000) Shr 16
Green = (PixelColor And $00FF00) Shr 8
If Red > (Green And blue) 
Return red 
ElseIf Green > (Red And Blue)



BHoltzman(Posted 2003) [#4]
Good Point! I'll try that.

That's what the problem was. Thanks, I guess I need to eat now or something.

I've noticed this program runs really slow on a 1000 x 650 picture. Any idea how to speed it up?

Thanks,

Ben


skidracer(Posted 2003) [#5]
You can't replace If Red>Green And Red>Blue with If Red > (Green And blue), And is a binary operator as in 4 And 3 gives 0.

Also you could calculate luminance as 0.299 Red + 0.587 Green + 0.114 Blue for better results


BHoltzman(Posted 2003) [#6]
Yeah, I was kind of hungry when I wrote it. So I didn't catch some stupid mistakes.

Is multiplication faster than the bit masking and shifting?


xlsior(Posted 2003) [#7]
-Snip-

(Incorrect code sample. See below for corrected version)


BHoltzman(Posted 2003) [#8]
Wow! That code is so Cool!! It looks a lot better than what I was doing, and I have no idea why. Is there any theory that I can have on it? Or any sites or books I can check out to help me understand this better?

Thanks,

Ben


xlsior(Posted 2003) [#9]
Oops!

Looks like I cut out a little too much while cleaning up my code: the percentage flag in the code above no longer works at all! Let me correct this, and repost.


xlsior(Posted 2003) [#10]
OK, here is the corrected function, including a fader loop as an example:

Graphics 640,480,16,2
img%=LoadImage("x:\monkey6.jpg")
SetBuffer BackBuffer()
DrawImage img%,0,0
For t=0 To 100 Step 10
   DrawImage img%,0,0
   monochrome (t)
   Flip
Next 
Delay 2000
For t=100 To 0 Step -10
   DrawImage img%,0,0
   monochrome (t)
   Flip
Next 
WaitKey()
End

Function Monochrome(perct#)
   SetBuffer BackBuffer()
   LockBuffer
   For y=0 To 479 
      For x=0 To 639
         temp1=ReadPixel(x,y)
         orgb=(temp1 And $FF)
         orgg=(temp1 And $FF00) Shr 8
         orgr=(temp1 And $FF0000) Shr 16
         desb=((orgr*0.299)+(orgg*0.587)+(orgb*0.114)) 
         desr=orgr*(1-(perct#/100))+desb*(perct#/100) 
         desg=orgg*(1-(perct#/100))+desb*(perct#/100) 
         desb=orgb*(1-(perct#/100))+desb*(perct#/100) 
         WritePixel x,y,desb+(desg Shl 8)+(desr Shl 16)
      Next 
   Next 
   UnlockBuffer
End Function


Unfortunately it isn't quite fast enough to look great as a fade, I think the effect is better to switch from full color to B&W in a single step rather than using the fade example listed above -- but it does illustrate how the function works.

Does anyone here happen to have a *fast* cross-fader?
Generating a pure B&W image and doing a *crossfade* would have the exact same effect after all... But probably much smoother, if the crossfader is fast enough.


xlsior(Posted 2003) [#11]
Ok, this is actually kind of funny: in the process of doing some more 'cleanups' to the monochrome code above, I accidentally messed up the declaration of the variables holding the target variables in the code... Which had a a very interesting side effect:
This made it lose all its monochrome abilities, but instead introduced a feedback loop into the pixel declarations, leading to an actual pixel BLURRING instead.

...Yes, I actually *accidentally* wrote a horizontal blur function. I still can't believe it. After that, vertical Blur was nothing more than swapping the 'x' and 'y' loops...


Clyde(Posted 2003) [#12]
Great stuff there XLSIOR & welldone guys :)

Really cool image effects :)


xlsior(Posted 2003) [#13]
Just in case anyone is interested: I just uploaded the blur code to the Code Archives forum as well.