Trouble with GrayScale Filter
BlitzPlus Forums/BlitzPlus Programming/Trouble with GrayScale Filter
| ||
| 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 |
| ||
| 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 |
| ||
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) |
| ||
| 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 |
| ||
| 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 |
| ||
| 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? |
| ||
| -Snip- (Incorrect code sample. See below for corrected version) |
| ||
| 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 |
| ||
| 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. |
| ||
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. |
| ||
| 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... |
| ||
| Great stuff there XLSIOR & welldone guys :) Really cool image effects :) |
| ||
| Just in case anyone is interested: I just uploaded the blur code to the Code Archives forum as well. |